简单的fork程序中不可预测的输出

时间:2016-02-13 20:37:29

标签: c linux pipe

请原谅我提出这样一个愚蠢的问题 - 我已经花了5个多小时试图找出原因,但我失败了。

以下是代码,这是我们考试的一个问题 - 我们被问到是否可以预测此代码的输出并且是否明确?

在几台机器上运行此代码之后,我发现各处的输出都是 - “child parent”。

我对下面代码的理解是,一旦进程分叉,就会创建一个进程副本,它只能执行只在fork()调用下面写的语句。现在一旦fork()完成,将有两个进程 - 子进程&父进程。 (我们已经在我们学校指示第一个父进程终止,然后在我们使用管道时进行子进程,但是在搜索互联网时,我只能看到无法确定哪个首先运行。

以下是我认为应该发生的事情 -

场景1 - Child首先执行

我认为当child首先执行时,它将首先打印“child”,然后写入文件描述符,然后子进程因_exit(0)而终止,然后父进程继续,读取并打印Parent。这就是正在发生的事情。我不知道这是否真的发生了。

场景2:首先执行父级,

现在它正试图先读取空管。父将尝试读取数据,被阻止,然后子将首先打印子,然后写入管道,这将启用读取命令,因此父项将在它之后打印。

有人可以确认我的理解是否正确,并指出我理解中的错误。

#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");
     }

1 个答案:

答案 0 :(得分:1)

在你的程序中,你有一个管道。父母从管道的一个头部读取,因此他等待,直到有人在管道的另一个头上写字。孩子写道,所以即使父母要先执行,他也会等孩子写。 改变这个:

read(fd[0], buffer, BUFSIZE);
printf("parent\n");

printf("parent\n");
read(fd[0], buffer, BUFSIZE);

然后重新运行它。现在它会在尝试阅读之前打印出来。即便如此,有时可能是第一个打印的孩子,有时也会是父母。这一切都取决于谁首先获得处理器。