我试图弄清楚使用以下C代码创建了多少个进程:
int main ()
{
fork();
if (fork()) {
fork();
}
fork();
return 0;
}
有一些我很困惑的事情:
每次调用fork()时,子进程是从代码的开头开始,还是从当前fork()创建的开始?例如,如果调用第3行的第一个fork,我会在第4行或第1行启动子节点吗?我相信这是一个愚蠢的问题,如果每个孩子从一开始就会创建一个无限循环,但是我想对这个假设保持安全。
接下来,当调用fork时,当前进程是否分成两个NEW进程,一个是父进程,另一个是子进程,或者当前进程是父进程,所以实际上只创建了一个额外的进程。
最后,使用if语句,我非常肯定fork在父ID实际上是父级时返回父级的值,并且当它是子级时总是返回0。那么,我是否正确地假设每个生成的孩子的if语句都是假的?
根据我上面的所有假设,这是我提出的过程树,如果有人看到一个错误的故障,我将非常感激。树中的子项数表示fork当前发生的代码行:
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个总进程(包括main)。我做错了吗?
答案 0 :(得分:1)
(1)直接在fork
之后的行。
(2)一个新的过程。孩子是父母的副本。
(3)fork
返回父项中子项的 pid,子项中返回0。 if语句对每个孩子都是假的。它应该出现在12个过程中。我绘制图表很糟糕,但你应该能够弄明白。
答案 1 :(得分:1)
在这里要清楚,并不是孩子在任何特定的线路上“开始”。 (无论如何,行在运行时实际上并不存在。)
子项在fork的位置成为父项的精确副本(其内核进程记录除外)。所以fork()被调用一次但返回两次,一次在父级中,一次在子级中。这就是为什么它叫做fork。差异从返回时开始,因为fork的返回值在两个分支中是不同的。但在这两种情况下,它只是一个普通的函数返回。
答案 2 :(得分:0)
问:每次调用fork()时,子进程是从代码的开头开始,还是从当前fork()创建它的地方开始?
答:来自“fork()”之后的陈述。
问:调用fork时,当前进程是否会拆分(导致)新进程?
答:是的。
问:当父实际上是父项时,fork会返回父项的值吗?当它是子项时,它会返回0
答:是的。除非创建进程时出错,否则返回-1。
点击此处了解更多信息: