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
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