当前位置:  技术问答>linux和unix

一个管道加进程调度的程序

    来源: 互联网  发布时间:2016-03-25

    本文导语:  程序源码如下:(书上的) #include  #include  #include "windows.h" #define MESSAGE_LEN 100 char parent[]={"A message from parent.n"}; char child[]={"A message from child."}; void main() { int chan1[2],chan2[2]; char buf[MESSAGE_LEN]; pipe(chan1);    //cr...

程序源码如下:(书上的)

#include 
#include 
#include "windows.h"
#define MESSAGE_LEN 100
char parent[]={"A message from parent.n"};
char child[]={"A message from child."};
void main()
{
int chan1[2],chan2[2];
char buf[MESSAGE_LEN];
pipe(chan1);    //create the first pipe
pipe(chan2); //creat the second pipe
if(fork())   /*this is perant process */
{
close(chan1[0]); //close the read channel of the first pipe
close(chan2[1]); //close the write channel of the second pipe
write(chan1[1],parent,sizeof(parent));
close(chan1[1]);
read(chan2[0],buf,MESSAGE_LEN);
printf("Parent process:%sn",buf);
close(chan2[0]);
}
else
{ /*  this is child process   */
close(chan1[1]);
close(chan2[0]);
read(chan1[0],buf,MESSAGE_LEN);
printf("Chlid process:%sn",buf);
write(chan2[1],child,sizeof(child));
close(chan1[0]);
close(chan2[1]);
}
}

这个程序看着不太懂:
1、这里的fork()函数的返回值是什么?
2、为什么会出现父进程,子进程执行的代码不一样?不是子进程复制父进程的所有资源吗?

麻烦哪位高手写出程序运行结果,并解释原因,谢谢了!

|
我们看懂,不知道能不能解析明白:) 
1.fork返回值问题
  当调用fork()返回后, 如果成功,一个非负的PID会返回到父进程;0返回到子进程。如果失败,返回-1到父进程。
  pid = fork();
  if (pid > 0) //表示这是父进程
  {
   // parent part
  }
  else if (pid == 0) // 这是子进程
  {
   // child part
  }
  else
  {
   // error
  }

  你可以这样认为,当调用fork()之后,就有了2个进程。它们完全一样(实际上还是有些差别的)。在父进程中,
  因为返回pid>0,所以执行if (pid>0)这条语句之后,就进入了"parent part部分代码"。而在子进程中,由于返回的
  pid为0。所以他首先也去执行 if (pid>0)的判断,不成立,继续else if (pid ==0)的判断,现在成立了,所以就进
  入到"child part"部分。

2.父进程和子进程的代码实际上是一样的,只是根据pid的返回值不同,它们分别执行了上面这段代码的不同分支而已。
  
  没有环境,就不试验了!

  

|
1.这里的fork()函数的返回值是什么?
  回答: 来自你的程序 
if(fork())  /*this is perant process */ 
{ -->fork() return the pid of child process


else --> fork() return 0
{ /*  this is child process  */ 


2、为什么会出现父进程,子进程执行的代码不一样?不是子进程复制父进程的所有资源吗?
  回答:fork子进程的目的主要是为了exec调用,执行另一个程序。

|
程序只有一份,就是你写的文档,但是这个程序可以运行很多次。fork以后父子进程其实就有点类似同一个程序在系统里运行了两次,区别父子进程执行的代码靠的就是对fork返回值的区分,要是返回的是0就执行else,也就是子进程;非0就执行父进程

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我用管道作为一个程序的标准输入时,程序报错说不是一个终端不能做为标准输入,请问怎么样管道成为它的标准输入呢???具体错误信息见内
  • 客户端程序和服务器程序间能否通过管道来实现数据的双向传递啊?
  • 请问如何让自己编写的Shell程序支持管道?
  • gcc程序怎么不能将输出重定向到文件或管道呀,你们有这个问题吗?
  • 这是一个关于Linux的管道的程序,请问一下这个程序是什么意思,能不能解释一下
  • 管道程序中write(STDOUT_FILENO,line,n)是什么意思呢?
  • 一个写管道程序问题
  • linux进程管道通信C语言编程:程序有问题,请指点迷津
  • 请大家帮我看看这个管道的程序.为什么有错误呢.奇怪.
  • 大家帮忙分析一下程序在哪个地方出了错?管道应用实例.
  • linux下管道程序求解
  • linux c语言编程 ------管道问题-----程序无法通过---求帮助
  • UNIX下利用管道重定向实现对程序的输出进行操作
  • cceczjxy 大侠,看看我的有名管道程序,急啊
  • 大家帮我看看,为什么我用有名管道,两个程序互发,发的发的就不发了,好像堵塞似的
  • 怎样模拟键盘给其他程序输入,用管道重定向怎么实现
  • 求命名管道FIFO编写两个程序,实现通信,简单聊天功能。
  • linux管道问题,管道建立后如何同步?
  • 哪位大侠知道Linux里的有名管道传送数据快不快?有名管道操作的过程是否有读写硬盘的操作?
  • 1哪位大侠知道Linux里的有名管道传送数据快不快?有名管道操作的过程是否有读写硬盘的操作?
  • 怎么样以非阻塞的方式从管道中读取数据?因为我用read函数时,如果管道没有数据就会阻塞住???
  • (100)"断开的管道" 在Socket编程当中,如果我连续发送包,例如1000次,总会出现"断开的管道"的错误提示,请问如何解决
  • 管道(|)是怎么实现的?
  • 多进程通讯的管道相关问题
  • 请问何时删除命名管道哪?
  • Linux下面的"匿名管道",是否对应着某种实体?
  • 串口和管道诡异的问题,在线急等解答
  • linux进程管道通信
  • 命名管道open时被阻塞了
  • 如何实现管道和后台进程
  • 关于有名管道的权限问题?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3