#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。请帮助。
答案 0 :(得分:1)
ACCBB
是不可能的。
我将为父级打印的字母添加下标 p ,为子级添加 c 。
父进程按此顺序打印A p B p C p ,子进程按顺序打印B c C c 的顺序。
A p 将首先被打印,因为它是在任何分叉之前被打印的。父级在打印C p 之前等待子级退出,因此必须排在最后。因此,这意味着第一个和最后一个字符为A
和C
。
在这之间,两个进程之间的执行顺序没有限制。因此,可能会发生以下情况:
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有关。