wait(null) 在这种情况下做了什么,程序的输出是什么?

what does wait(null) do in this case and what is the output of the program?

if (fork() == 0) {
    printf("[Child] I'm exiting\n");
}

else {
    wait(NULL);
    printf("[Parent] child exited\n");

}

wait(NULL) 等待 any child 完成,然后它会执行它之后的所有内容。那么在这种情况下,程序的输出是什么?

我们可能会先进入父级,然后我们必须等待子级完成,所以它 [Child] ..... , [Parent] .... 打印。

我们也可以进入 child,打印它的内容,然后是 parent,在这种情况下 wait(NULL) 将永远等待,因为 child process 已经完成。所以在这种情况下,输出将是 just [Child].....?

我 运行 1000 次,但看起来它的输出是 always child ... parent

谢谢

如果子进程还没有退出,父进程会一直等到它退出。

如果子进程已经退出,父进程会获取其状态信息,然后继续执行。在这种情况下,函数 wait() 将立即 return。 See this.

所以这个程序总是打印:

[Child] I'm exiting
[Parent] child exited

看起来您实际上要问的潜在问题是 fork 是如何工作的。

当您执行 fork() 时,操作系统会复制调用进程(parent)。它创建一个 child,它是 parent 的精确副本(减去 some details)。 fork()函数的return值在child进程中是0,在parent进程中是child的PID。

所以,在你的fork之后,child进程会执行if子句下的代码,而parent会执行else子句下的代码.请记住,您现在有 2 个并行执行的进程。但是,parent 进程由于 wait(NULL) 而被阻塞,直到 child 退出。当 child(打印消息)并退出时,parent 继续执行 wait 之后的代码,打印其消息并退出。

这就是为什么你会总是看到:

[Child] I'm exiting
[Parent] child exited