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
次,但看起来输出的总是孩子......父母
由于
答案 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