什么是等待(null)在这种情况下做什么,程序的输出是什么?
问题描述:
if (fork() == 0) {
printf("[Child] I'm exiting\n");
}
else {
wait(NULL);
printf("[Parent] child exited\n");
}
wait(NULL)
等待任何孩子来完成,然后它会之后执行的一切。所以在这种情况下,程序的输出是什么?什么是等待(null)在这种情况下做什么,程序的输出是什么?
我们可能先进入父母,然后我们将不得不等待孩子完成,因此它的[Child] ..... , [Parent] ....
打印。
我们还可以进入子,其打印东西,然后父母,在这种情况下wait(NULL)
会永远等待,因为child process
已经completle。所以在这种情况下,输出是只是[Child].....
?
我跑1000
倍,但它看起来像它的输出始终孩子 ...父
感谢
答
如果孩子还没有退出,父将等待,直到它退出。
如果孩子已经退出,父母将获得其状态信息,然后继续执行。在这种情况下,函数wait()
将立即返回。 See this。
所以这个程序将始终打印:
[Child] I'm exiting
[Parent] child exited
答
看起来你实际上是在问垫层问题是如何fork
作品。
当你做fork()
时,操作系统会复制调用进程(父进程)。它会创建一个孩子,这是父母的完全副本(减去some details)。 fork()
函数的返回值是子进程中的0
和父进程中的子进程的PID。
所以,在您的fork
之后,子进程将执行if
子句下的代码,父进程将执行else
子句。请记住,您现在有两个并行执行的进程。但是,父进程会因为wait(NULL)
而被阻止,直到孩子退出。当孩子(打印消息)并退出时,父母继续执行wait
后的代码,打印其消息并退出。
这就是为什么你会总是见:
[Child] I'm exiting
[Parent] child exited
'任何孩子等待complete' ::是这样,*块*直到wait()的回报。如果它返回,您**知道孩子已经终止。 – wildplasser