[英]Unpredictable output in simple fork program
请原谅我一个如此愚蠢的问题的社区-我已经花了5个多小时试图找出原因,但我失败了。
以下是代码,这是我们考试中的一个问题-我们被问到是否可以预测此代码的输出,并且确定吗?
在多台机器上运行此代码后,我发现到处输出的都是-“ child parent”。
我对以下代码的理解是,一旦流程分叉,将创建流程的副本,该副本只能执行仅在fork()调用下编写的语句。 现在完成fork()后,将有两个进程-子进程和父进程。 (我们学校曾指示我们在使用管道时首先终止父进程,然后终止子进程,但是在搜索互联网时,我只能看到无法确定哪个先运行。
我认为这应该发生-
我认为,当child首先执行时,它将首先打印“ child”,然后写入文件描述符,然后由于_exit(0)终止子进程,然后父进程继续进行,读取并打印Parent。 这就是正在发生的事情。 我不知道这是否真的在发生。
现在,它尝试首先读取空管道。 父级将尝试读取数据,被阻止,然后子级将首先打印子级,然后写入管道,这将启用读取命令,因此父级将在其后打印。
有人可以确认我的理解是否正确,并指出我的理解中的错误。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
int BUFSIZE = 4096;
int main (int argc, char* argv[])
{ int fd[2];
pid_t pid;
char buffer[BUFSIZE];
pipe(fd);
if ((pid = fork()) == 0)
{ printf("child\n");
write(fd[1], "a", 1);
_exit(0);
}
read(fd[0], buffer, BUFSIZE);
printf("parent\n");
}
在您的程序中,您有一个管道。 父从管道的一个磁头读取,因此,他等待 ,直到有人在管道的另一头写。 孩子会写,所以即使父母先执行,他也会等待孩子写。 更改此:
read(fd[0], buffer, BUFSIZE);
printf("parent\n");
至
printf("parent\n");
read(fd[0], buffer, BUFSIZE);
并重新运行它。 现在它将在尝试阅读之前打印。 即使这样,时不时地,孩子还是第一个打印的孩子,有时是父母的孩子。 这完全取决于谁先获得处理器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.