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

时间:2017-08-14 00:35:53

标签: c linux unix fork wait

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

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

}

wait(NULL)等待任何子项完成,然后它将执行后面的所有操作。那么在这种情况下,程序的输出是什么?

我们可能先进入父母,然后我们将不得不等待孩子完成,因此打印出[Child] ..... , [Parent] ....

我们也可以进入孩子,打印它的东西,然后是父母,在这种情况下wait(NULL)会永远等待,因为child process已经完成了。那么在这种情况下,输出只是 [Child].....

我跑1000次,但看起来输出的总是孩子......父母

由于

2 个答案:

答案 0 :(得分:1)

如果孩子没有退出,家长会等到孩子退出。

如果孩子退出,父母将获得其状态信息,然后继续执行。在这种情况下,函数wait()将立即返回。 See this

所以这个程序将始终打印:

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

答案 1 :(得分:1)

看起来您实际问的问题是fork的工作原理。

执行d = {}; d[[1,2]] = 5; d[[2,1]] = 6; console.log("d[[1,2]]:", d[[1,2]]); console.log("d['1,2']:", d['1,2']); m = new Map(); ak1 = [1,2]; ak2 = [1,2]; m.set([1,2], 5); m.set([2,1], 6); m.set(ak1, 7); console.log("m.get('1,2'):", m.get('1,2')); console.log("m.get([1,2]):", m.get([1,2])); console.log('m.get(ak1):', m.get(ak1)); console.log('m.get(ak2):', m.get(ak2));时,操作系统会复制调用进程(父进程)。它会创建一个子项,它与父项完全相同(减去some details)。子进程中fork()函数的返回值为fork(),父进程中为子进程的PID。

因此,在0之后,子进程将执行fork子句下的代码,父进程将执行if子句。请记住,您现在有2个进程并行执行。但是,父进程由于else而被阻止,直到子进程退出。当孩子(打印消息)并退出时,父母继续在wait(NULL)之后执行代码,打印消息并退出。

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

wait
相关问题