什么是等待(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倍,但它看起来像它的输出始终孩子 ...父

感谢

+0

'任何孩子等待complete' ::是这样,*块*直到wait()的回报。如果它返回,您**知道孩子已经终止。 – wildplasser

如果孩子还没有退出,父将等待,直到它退出。

如果孩子已经退出,父母将获得其状态信息,然后继续执行。在这种情况下,函数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