fork()从哪里执行循环?

时间:2014-10-27 08:41:02

标签: c linux fork

考虑下面的代码,程序在for循环中的fork()之后开始执行?我无法理解输出。

 #include <stdio.h>                                                                                 
 #include <sys/types.h>                                                                             

 int parent_code() {                                                                                
     printf("[%d] Parent\n",getpid());                                                                
 }                                                                                                  

 int child_code() {                                                                                 
     printf("[%d] Child\n",getpid());                                                                 
 }                                                                                                  

 int main() {                                                                                       
     int i;                                                                                           
     pid_t pid;                                                                                       

     for(i=0;i<4;i++) {                                                                               
         pid = fork();                                                                                  
         if(pid == 0) {                                                                                 
             child_code();                                                                                
         } else {                                                                                       
             parent_code();                                                                               
             waitpid(pid,&i,0);                                                                           
         }                                                                                              
     }                                                                                                
}  

输出:

[4896] Parent
[4897] Child
[4897] Parent
[4898] Child
[4898] Parent
[4899] Child
[4899] Parent
[4900] Child
[4898] Parent
[4901] Child
[4897] Parent
[4902] Child
[4902] Parent
[4903] Child
[4897] Parent
[4904] Child
[4896] Parent
[4905] Child
[4905] Parent
[4906] Child
[4906] Parent
[4907] Child
[4905] Parent
[4908] Child
[4896] Parent
[4909] Child
[4909] Parent
[4910] Child
[4896] Parent
[4911] Child

更新

  1. 子程序从哪里开始执行?

  2. 如果从顶部开始,是否会有叉炸弹(孩子再次调用叉子)?所以在这个程序中,我期望子进程从if(pid == 0) {的行开始执行,我只想要一个父进程和4个子进程。我在哪里做错了?

2 个答案:

答案 0 :(得分:2)

理解fork系统调用的一种简单方法是将其视为返回两次的函数。它在父级中返回一次,就像普通函数一样,在新进程中再次返回。 这两个进程在fork“返回”的地方继续。

  

我只想要一个父进程和4个子进程。我哪去了   做错了

想想第一个子进程。它会调用child_code()然后它自己分叉。如果他们可以通过循环,孩子们也会分叉。防止这种情况的一种简单方法是在break之后调用child_code

答案 1 :(得分:1)

你基本上是在做一棵树 最多2的示例:

Process
0       Parent                 Parent
1             Child Parent
2                         Child
3                                    Child Parent
4                                                Child