【问题标题】:What is the output of the following fork program?以下 fork 程序的输出是什么?
【发布时间】:2018-01-23 17:26:45
【问题描述】:
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;
}

我得到的输出如下:

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)

我已经运行了 100 次,总是得到ABD ... terminate ... CD。 “D”总是出现在“B”之前。这只是随机的还是我没有看到的原因?

谢谢。

【问题讨论】:

  • 你总是得到 ADBCD,还是程序有时会在第二个字母之后终止?您似乎发布了相互矛盾的信息。
  • ABD ...终止... CD
  • 查看此答案,尤其是第四部分:stackoverflow.com/a/6697102/13422
  • 啊,但后来我发现:stackoverflow.com/questions/17391201/…
  • 发布的代码有一些重大的疏忽。 1) 缺少必要的头文件语句。 2) 对fork() 的调用返回的类型是pid_t 而不是int 3) 对fork() 的调用都缺少错误返回检查。 4)顶级和二级父进程等待子进程退出失败。 (这种疏忽导致僵尸进程) 5)有这么多进程,对wait() 的调用不知道它在等待谁。强烈建议使用waitpid()(续)

标签: c fork


【解决方案1】:

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

例如,在我的机器上,我得到“ADB (end) CD”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多