理解fork()语句及其进程树

我想弄清楚用下面的C代码创build了多less个进程:

int main () { fork(); if (fork()) { fork(); } fork(); return 0; } 

有一些我很困惑的事情:

每次调用fork()时,子代是从代码的开始处开始还是从当前fork()创build的地方开始? 例如,如果第3行的第一个叉被调用,我会在第4行还是第1行启动subprocess? 我认为这是一个愚蠢的问题,如果每个孩子从一开始就会造成一个无限循环,但是我想对这个假设保持安全。

接下来,在调用fork的时候,当前进程是否被拆分成两个NEW进程,一个是父进程,另一个是subprocess,或者是当前进程自动成为父进程,所以实际上只创build一个额外的进程。

最后,用if语句,我相当确定的是,fork实际上是父对象时返回父对象的值,当它是子对象时总是为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. 

因此,总共创build了10个进程(包括主进程)。 我做错了吗?

(1)直接在fork后行。

(2)一个新的过程。 孩子是父母的副本。

(3) fork在父项中返回孩子的 pid,在孩子中返回0。 if语句对每个孩子都是错误的。 它应该出来12个进程。 我在绘制图表上很糟糕,但你应该能够弄明白。

这里要说清楚,并不是孩子在任何特定的路线上“开始”。 (线路实际上不存在运行时间。)

这个孩子在fork的时候变成了父母的精确副本(除了它的内核进程记录)。 所以fork()被调用一次,但返回两次,一次在父,一次在子。 这就是为什么它被称为叉。 差异从返回的时刻开始,因为fork的返回值在两个分支中是不同的。 但在这两种情况下,这只是一个普通的函数返回。

问:每次调用fork()时,孩子是从代码的开始处开始,还是从当前fork()创建的地方开始?

答:从“fork()”后面的语句。

问:当fork被调用时,当前进程是否被拆分(导致了)NEW进程?

答:是的。

问:fork是否实际上是父对象时返回父对象的值,并且在它是子对象时始终为0

答:是的。 除非创建过程出现错误,否则返回-1。

在这里寻找更多的信息: