当前位置: 技术问答>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、为什么会出现父进程,子进程执行的代码不一样?不是子进程复制父进程的所有资源吗?
麻烦哪位高手写出程序运行结果,并解释原因,谢谢了!
#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返回值问题
当调用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调用,执行另一个程序。
回答: 来自你的程序
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。