我想弄清楚用下面的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。
在这里寻找更多的信息: