Linux平台创建多个进程的方法


自己第一次写创建多个进程的程序时不加思索地用循环,类似如下,

for(i=0; i<3; i++)
{
pid =fork();
if(pid==0)
{
child_process();
}
}

结果运行之后的结果很奇怪,因为父进程创建出来的子进程又会创建子进程,所以像一棵树一样创建下去,而不是所有子进程皆以主进程为父亲!

正确的方法应该是像引文中一样,如下;

法一

  1. #include<stdio.h>   
  2. #include<stdlib.h>   
  3. #include<unistd.h>   
  4. pid_t pid;   
  5. /*  
  6.  * num:当前已经创建的子进程数  
  7.  * max:需要创建的子进程数  
  8.  */  
  9. void createsubprocess(int num,int max)   
  10. {   
  11.     if(num>=max)return;   
  12.     pid=fork();   
  13.     if(pid<0)   
  14.     {   
  15.         perror("fork error!\n");   
  16.         exit(1);   
  17.     }   
  18.     //子进程   
  19.     else if(pid==0)   
  20.     {   
  21.         sleep(3);   
  22.         printf("子进程id=%d,父进程id=%d\n",getpid(),getppid());   
  23.     }   
  24.     //父进程   
  25.     else  
  26.     {   
  27.         num++;   
  28.         if(num==1)printf("父进程id=%d\n",getpid());   
  29.         if(num<max)createsubprocess(num,max);   
  30.         //此处加sleep是为了防止父进程先退出,从而产生异常   
  31.         sleep(5);   
  32.     }   
  33. }   
  34. int main()   
  35. {   
  36.     int num=0;   
  37.     int max=3;   
  38.     createsubprocess(num,max);   
  39.     return 0;   
  40. }  

法二

  1. #include<stdio.h>   
  2. #include<stdlib.h>   
  3. #include<unistd.h>   
  4. /*  
  5.  * 创建指定数目的子进程  
  6.  */  
  7. void createsubprocess(int num)   
  8. {   
  9.     pid_t pid;   
  10.     int i;   
  11.     for(i=0;i<num;i++)   
  12.     {   
  13.         pid=fork();   
  14.         //子进程或创建进程失败均退出   
  15.         if(pid==0||pid==-1)   
  16.         {   
  17.             break;   
  18.         }   
  19.     }   
  20.     if(pid==-1)   
  21.     {   
  22.         perror("fail to fork!\n");   
  23.         exit(1);   
  24.     }   
  25.     else if(pid==0)   
  26.     {   
  27.         printf("子进程id=%d,其对应的父进程id=%d\n",getpid(),getppid());   
  28.         exit(0);   
  29.     }   
  30.     else  
  31.     {   
  32.         printf("父进程id=%d\n",getpid());   
  33.         exit(0);   
  34.     }   
  35. }   
  36. int main()   
  37. {   
  38.     int num=3;   
  39.     createsubprocess(num);   
  40.     return 0;   
  41. }  

唉,竟然能用递归实现,小小崇拜一下^^  不知道第一个写上面这样代码人是如何想到的!  也许大多数人都会想到用“无耻的”循环吧!

相关内容