Fork同时创建多个子进程方法

第一种方法:验证通过

特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程

int main(void)

{

printf("before fork(), pid = %d\n", getpid());

pid_t p1 = fork();

if( p1 == 0 )

{

printf("in child 1, pid = %d\n", getpid());

return 0;//若此处没有return 0 p1进程也会执行pid_t p2=fork()语句

}

pid_t p2 = fork();

if( p2 == 0 )

{

printf("in child 2, pid = %d\n", getpid());

return 0;//子进程结束,跳回父进程

Printf("hello world\");//没有打印

}

int st1, st2;

waitpid( p1, &st1, 0);

waitpid( p2, &st2, 0);

printf("in parent, child 1 pid = %d\n", p1);

printf("in parent, child 2 pid = %d\n", p2);

printf("in parent, pid = %d\n", getpid());

printf("in parent, child 1 exited with %d\n", st1);

printf("in parent, child 2 exited with %d\n", st2);

return 0;

}

第二种方法: 验证通过

特点:同时创建两个子进程,结构比较繁琐,程序可读性不好,不易扩展

#include

#include

#include//这个头文件不能少,否则pid_t没有定义

main()

{

printf("This is parent process%d\n",getpid());

pid_t p1,p2;

if((p1=fork())==0)

{

printf("This is child_1 process%d\n",getpid());

}

Else

{

if((p2=fork())==0)

{

printf("This is child_2 process%d\n",getpid());

}

Else

{

wait(p1,NULL,0);

wait(p2,NULL,0);

printf("This is parent process%d\n",getpid());

}

}

}

第三种方法:for循环方法

特点:其实每次循环只是创建了单个进程,并没有同时创建多个进程

#include

#include

#include

main()

{

printf("This is parent process%d\n",getpid());

pid_t p1,p2;

int i;

for(i=0;i<=2;i++)

{

if((p1=fork())==0)

{

printf("This is child_1 process%d\n",getpid());

return 0;//这个地方非常关键

}

wait(p1,NULL,0); //父进程等待p1子进程执行后才能继续fork其他子进程

printf("This is parent process%d\n",getpid());

}

}

注意:标注的 return 0对程序结果影响很大

无 return 0情况

#include

#include

#include

main()

{

printf("This is parent process%d\n",getpid());

pid_t p1,p2;

int i;

for(i=0;i<=2;i++)

{

if((p1=fork())==0)

{

printf("This is child_1 process%d\n",getpid());

//return 0;//这个地方非常关键

}

wait(p1,NULL,0);

printf("This is parent process%d\n",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

{

status = fork();

if (status == 0 || status == -1) break;//每次循环时,如果发现是子进程就直接从创建子进程的循环中跳出来,不让你进入循环,这样就保证了每次只有父进程来做循环创建子进程的工作

}

if (status == -1)

{

//error

}

else if (status == 0)//每个子进程都会执行的代码

{

//sub process

}

else

{

//parent process

}

linux 创建子进程,linux中fork同时创建多个子进程的方法(一)相关推荐

  1. linux 创建子进程,Linux中使用fork创建子进程详解及示例程序

    1. 进程 1.1. 什么是进程 当可执行文件开始运行之后,就变为了系统中的一个进程,一个程序(可执行文件)运行起来之后可以创建多个进程执行,称之为多进程程序. 每个进程包含有进程运行环境.内存地址空 ...

  2. linux进程看门狗使用方式,Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法...

    Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法 [技术领域] [0001] 本发明涉及Linux系统的进程监控技术领域,特别是涉及一种Linux系统中基于看 门狗的精细化进程监控方法及 ...

  3. linux编程两个子进程,Linux中fork同时创建多个子进程的方法

    怎么创建多个进程呢?我说那还不容易,看下边代码: //省略必要头文件 int main() { pid_t pid[2]; int i; printf("This is %d\n" ...

  4. Linux中fork()系统调用创建两个子进程

    使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...

  5. tomcat中request对象是被创建的_Python中对象的创建与引用

    上文传送门,又见面向对象,不变的是思想,变的只是语言. 今日开始,我们深入来了解面向对象. 四.创建与引用 1.创建对象的流程 在创建对象时,看不见的手,帮我们做了三件事情,如下图: 1class S ...

  6. java jframe创建窗体_Java中利用JFrame创建窗体

    1. 一个简单例子: Java代码   public class Test(){ public static void main(String[] args){ JFrame frame = new  ...

  7. qt5设置linux系统时间,Qt中使用QLabel显示时间的两种方法

    Qt中使用QLabel显示时间的两种方法思路一致,只是实现方法不一样而已. main.cpp #include "displaytime.h" #include int main( ...

  8. linux下openssh5.3漏洞,linux的低版本中openssh三大漏洞的分析及修复方法

    一:漏洞分析最近进行linux系统安全加固分析,进行漏洞扫描扫描分析,不扫不知道,一扫吓一跳,linux系统服务器的 OPENSSH存在3大安全漏洞,祥如下: 1:OpenSSH GSSAPI 处理远 ...

  9. java中怎样创建线程_java中的线程创建和使用

    Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口.Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合 ...

最新文章

  1. 运维想吃透监控系统,就这一篇足够了
  2. 每日站立会议12/23
  3. DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp...
  4. TreeView控件节点重命名后没有进入beginEdit的解决方案
  5. 数据之路 Day5 - Python基础5
  6. MFC中CString和int的转换
  7. linux安装mysql后怎么进去_linux安装mysql详细步骤
  8. 科技通讯PSD分层海报出击!Hello 5G时代
  9. SVN Error: “' 'x' isn't in the same repository as 'y' ” during merge (并不在同一个版本库中)...
  10. Python中可变长度的参数args和**kwargs
  11. 【最短路】Walls
  12. 获取类型的完全限定名
  13. CAD打印后图形不显示?
  14. 优雅计算算式:后缀表达式
  15. 使用摄像头解析二维码,且可以生成含具体信息的二维码
  16. 八大方法改善皮肤黄气
  17. python提取cad坐标_怎么提取cad中坐标?CAD批量提取坐标点的三种方法
  18. 程序员为维持游戏开发被迫炒股,一年内反赚1600万;雷军退任天星银行董事会主席;华为开源Karmada将捐赠CNCF...
  19. MD5简介及使用方式
  20. L2-040 哲哲打游戏 (25 分)(分析题目意思,读懂题)

热门文章

  1. [概念] 价值分析(Value Analysis)/价值工程 (Value Engineering)
  2. 使用JDK自带的工具keytool生成证书
  3. 02 数学软件与建模---MATLAB入门
  4. 40亿个整数,求上中位数
  5. [附源码]java毕业设计代驾服务系统
  6. java-php-python-ssmNBA论坛系统计算机毕业设计
  7. pq grid 及 一些基本方法
  8. ZCMU-1133- 第九章:致我们终将逝去的青春
  9. 怎么才能戒烟最好的方法,这样戒烟最有效
  10. 专属程序员的浪漫七夕