我试图弄清楚使用以下 C 代码创建了多少进程:
int main ()
{
fork();
if (fork()) {
fork();
}
fork();
return 0;
}
有几件事我很困惑:
每次调用 fork() 时,子进程是从代码的开头开始,还是从当前 fork() 创建它的位置开始?例如,如果调用了第 3 行的第一个 fork,我会在第 4 行还是第 1 行启动子进程?我相信这是一个愚蠢的问题,b/c 如果每个孩子从头开始,它会创建一个无限循环,但我想对这个假设保持安全。
接下来,当调用 fork 时,当前进程是否拆分为两个新进程,一个是父进程,另一个是子进程,还是当前进程自动成为父进程,所以实际上只创建了一个额外的进程。
最后,使用 if 语句,我很确定 fork 在它实际上是父级时返回父级 id 的值,当它是子级时总是 0。那么,我是否正确假设 if 语句对于每个产生的孩子都是错误的?
有了以上所有假设,这是我提出的流程树,如果有人看到导致它失败的错误,我将不胜感激。树中子节点的数量代表当前分叉发生的代码行:
main
| | | |
3 4 5 7 // the main/initial process calls fork 4 times
| | | | |
4 5 7 7 7 // the first fork will see 3 additional forks since it was called
| | // at line 3 and I assume resumes at line 4.
7 7 // The second and third original children would each only callthe
// very last fork(). The last fork has no other forks following.
因此,总共创建了 10 个进程(包括主进程)。我做错了吗?