如何用fork()知道代码中的输出?

时间:2019-04-10 22:34:33

标签: c unix fork

#include <unistd.h>
#include <sys/wait.h>
int main ()
{
    W(A);
    int child=fork();
    W(B);
    if (child)
      wait(NULL);
    W(C);
}

我认为ABBCC将是输出之一,但也是下一个输出:ACCBB,ABB,ABCBC,ABCAA应该是正确的。 W表示写入,W(A),W(B),W(C)表示写入A,B,C。请帮助。

1 个答案:

答案 0 :(得分:1)

ACCBB是不可能的。

我将为父级打印的字母添加下标 p ,为子级添加 c

父进程按此顺序打印A p B p C p ,子进程按顺序打印B c C c 的顺序。

A p 将首先被打印,因为它是在任何分叉之前被打印的。父级在打印C p 之前等待子级退出,因此必须排在最后。因此,这意味着第一个和最后一个字符为AC

在这之间,两个进程之间的执行顺序没有限制。因此,可能会发生以下情况:

B p B c C c
B c B p C c
B c C c B p

前两个输出看起来相同,因为我们无法区分B p 和B c

所以可能的结果是:

ABBCC
ABCBC

所有这些都假定没有缓冲可能会延迟输出。即这只是检查语句可以在并发进程中执行的顺序的一种练习,而不是真正与I / O有关。