加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Linux中fork同时创建多个子进程的技巧

发布时间:2021-12-10 14:18:58 所属栏目:PHP教程 来源:互联网
导读:Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { printf(before fork(), pid = %dn, getpid()); pid_t p1 = fork(); if( p1 ==
Fork同时创建多个子进程方法
 
第一种方法:验证通过
 
特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程
 
int main(void)
 
{
 
printf("before fork(), pid = %dn", getpid());
 
pid_t p1 = fork();
 
if( p1 == 0 )
 
{
 
printf("in child 1, pid = %dn", getpid());
 
return 0; //若此处没有return 0 p1 进程也会执行 pid_t p2=fork()语句
 
}
 
pid_t p2 = fork();
 
if( p2 == 0 )
 
{
 
printf("in child 2, pid = %dn", getpid());
 
return 0; //子进程结束,跳回父进程
 
Printf("hello world");//没有打印
 
}
 
int st1, st2;
 
waitpid( p1, &st1, 0);
 
waitpid( p2, &st2, 0);
 
printf("in parent, child 1 pid = %dn", p1);
 
printf("in parent, child 2 pid = %dn", p2);
 
printf("in parent, pid = %dn", getpid());
 
printf("in parent, child 1 exited with %dn", st1);
 
printf("in parent, child 2 exited with %dn", st2);
 
return 0;
 
}
 
第二种方法: 验证通过
 
特点:同时创建两个子进程,结构比较繁琐,程序可读性不好,不易扩展
 
#include<stdio.h>
 
#include<unistd.h>
 
#include<sys/types.h> //这个头文件不能少,否则pid_t没有定义
 
main()
 
{
 
printf("This is parent process%dn",getpid());
 
pid_t p1,p2;
 
if((p1=fork())==0)
 
{
 
printf("This is child_1 process%dn",getpid());
 
}
 
Else
 
{
 
if((p2=fork())==0)
 
{
 
printf("This is child_2 process%dn",getpid());
 
}
 
Else
 
{
 
wait(p1,NULL,0);
 
wait(p2,NULL,0);
 
printf("This is parent process%dn",getpid());
 
}
 
}
 
}
 
第三种方法:for 循环方法
 
特点:其实每次循环只是创建了单个进程,并没有同时创建多个进程
 
#include<stdio.h>
 
#include<unistd.h>
 
#include<sys/types.h>
 
main()
 
{
 
printf("This is parent process%dn",getpid());
 
pid_t p1,p2;
 
int i;
 
for(i=0;i<=2;i++)
 
{
 
if((p1=fork())==0)
 
{
 
printf("This is child_1 process%dn",getpid());
 
return 0;//这个地方非常关键
 
}
 
wait(p1,NULL,0); //父进程等待p1子进程执行后才能继续fork其他子进程
 
printf("This is parent process%dn",getpid());
 
}
 
}
 
注意:标注的 return 0 对程序结果影响很大
 
无 return 0 情况
 
#include<stdio.h>
 
#include<unistd.h>
 
#include<sys/types.h>
 
main()
 
{
 
printf("This is parent process%dn",getpid());
 
pid_t p1,p2;
 
int i;
 
for(i=0;i<=2;i++)
 
{
 
if((p1=fork())==0)
 
{
 
printf("This is child_1 process%dn",getpid());
 
//return 0;//这个地方非常关键
 
}
 
wait(p1,NULL,0);
 
printf("This is parent process%dn",getpid());
 
}
 
}
 
结论:父进程会生成 n(n+1)/2+1个子进程,N 为循环次数,本例中共有 7 个子进程, 但实际上只有 3 个是父进程产生的,其余都为子进程 fork()出来的。父进程fork了3个进程,第一个子进程执行完之后又fork了2个进程,第2个子进程fork了1个进程。
 
正确的使用Linux中的用fork()由一个父进程创建同时多个子进程 的格式如下:
 
int status,i;
 
for (i = 0; i < 10; i++)
 
{
 
  status = fork();
 
  if (status == 0 || status == -1) break;//每次循环时,如果发现是子进程就直接从创建子进程的循环中跳出来,不让你进入循环,这样就保证了每次只有父进程来做循环创建子进程的工作
 
}
 
if (status == -1)
 
{
 
  //error
 
}
 
else if (status == 0) //每个子进程都会执行的代码
 
{
 
  //sub process
 
}
 
else
 
{
 
  //parent process
 
}

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读