Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以下fork程序的输出是什么?_C_Fork - Fatal编程技术网

C 以下fork程序的输出是什么?

C 以下fork程序的输出是什么?,c,fork,C,Fork,我得到的输出如下: int main() { int p1, p2; printf("A\n"); // we always print A first p1 = fork(); if (p1 == 0) { // child printf("B\n"); p2 = fork(); // fork if (p2 == 0) { sleep(2); printf("C\n"); exit(0); } w

我得到的输出如下:

int main() {
int p1, p2;
printf("A\n"); // we always print A first
p1 = fork();

if (p1 == 0) { // child
    printf("B\n"); 

    p2 = fork(); // fork

    if (p2 == 0) {
        sleep(2);
        printf("C\n");
        exit(0);
    }
    wait(0); // parent waits for child to finish
}
printf("D\n"); 
exit(0);


return 0;
}

我已经运行了100次,我总是得到ABD。。。终止光盘“D”总是在“B”之前。这是随机的还是我没有看到的原因


谢谢。

确切的输出完全取决于操作系统如何安排每个进程。父级和第一个子级之间没有同步,因此B和D可以按任意顺序打印


例如,在我的机器上,我得到ADB end CD。

您总是得到ADBCD,还是程序有时会在第二个字母后终止?你似乎发布了相互矛盾的信息。。。终止看到这个答案,尤其是第四部分:啊,但是我发现:发布的代码有一些重大的疏忽。1缺少必要的头文件语句。2对fork的调用返回的类型为pid\t not int 3对fork的两个调用都缺少对错误返回的检查。4顶级和二级父进程无法等待子进程退出。这样的疏忽导致僵尸进程5中有这么多进程,对wait的调用不知道jst在等待谁。强烈建议使用waitpid cont
A // always first

B or D // whether we are in parent or child. Program may be terminated here

C // always since parent of p2 waits

D // since p2 parent exits if condition, prints D, then exits(0)