排除初始父进程,以下代码将创建多少个进程:
fork();
wait(0);
fork();
wait(0);
fork();
我想到了7个过程,因为父亲总是等待孩子结束,但孩子永远不会退出。所以这将是2 ** n - 1。
答案 0 :(得分:1)
每次调用fork函数都会创建一个新进程。每个进程(包括父进程)都将在fork调用后执行代码。每个父母都会等待其孩子死亡(请记住,当孩子调用fork时,它也会成为父母)。
绘制架构以确保:
这给出了7个进程,不包括父进程。
从最右边的分支读取树,然后以下注释可能有意义:
fork(); // Process 'c0' was created
wait(0); // Parent process 'p' waits for its child 'c0' to change state.
fork(); // c1, c4
wait(0); // c0, p
fork(); // c2, c3, c5, c6
我用打印语句和流程创建的 Online Demo ' ID确认了这一点。
提醒wait()
中的0
参数:
等待进程组ID等于调用进程ID的任何子进程。
在C - meaning of wait(NULL) when executing fork() in parallel中阅读更多内容。
请注意,如果您注释掉等待呼叫,则进程数量不会发生变化。