fork同一时候创建多个子进程的方法
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<stdio.h>
#include<unistd.h>
#include<sys/types.h> //这个头文件不能少,否则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<stdio.h>
#include<unistd.h>
#include<sys/types.h>
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<stdio.h>
#include<unistd.h>
#include<sys/types.h>
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 < 10; i++)
{
status = fork();
if (status == 0 || status == -1) break;//每次循环时,假设发现是子进程就直接从创建子进程的循环中跳出来。不让你进入循环,这样就保证了每次仅仅有父进程来做循环创建子进程的工作
}
if (status == -1)
{
//error
}
else if (status == 0) //每一个子进程都会运行的代码
{
//sub process
}
else
{
//parent process
}
fork同一时候创建多个子进程的方法的更多相关文章
- Linux之创建多个子进程
/*** fork_test.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int ...
- 利用Process类创建多个子进程对象执行任务,主进程负责调度
import time from multiprocessing import Process def run1(): for i in range(5): print("sunck is ...
- Linuxc:创建与监控多个子进程
#include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <signal ...
- PHP多进程学习(二)__fork起多个子进程,父进程的阻塞与非阻塞
先简单来了解一下多进程 [来初步了解一下PHP多进程及简单demo] php的多进程是不是可以无限制的fork子进程?fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的 ...
- clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...
- Linux如何创建一个新进程
2016-03-31 张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux如何创建一个新进程 ...
- 实验 六:分析linux内核创建一个新进程的过程
实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...
- 关于操作系统中多个fork()会创建几个进程的理解
最近在看操作系统的书,在讲到用fork()创建子进程时,有些地方一时迷惑,最终理解,特记录下来.如下: //创建一个子进程:#include "csapp.h" int main( ...
- linux里面的fork函数创建一个新进程
由fork创建的新进程成为子进程,fork函数被调用一次,但是返回两次,
随机推荐
- python的urlencode与urldecode
```python3.x中urlencode在urllib.parse模块中``` 当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的call ...
- Cocos2d-x学习资源集锦+有奖抽楼活动
大家好,事实上我是这个游戏开发版块的新任版主之中的一个,可能大家的焦点都在candycat1992女版主身上,所以我认为我应该冒个泡. 俗话说,新版主上任,三把"水"(是你自己说的 ...
- 从HTTP 2.0想到的关于传输层协议的一些事
0.HTTP协议的历史 我也不知道... 1.关于HTTP 2.0 收到了订阅的邮件,头版是说HTTP 2.0的内容,我本人不是非常关注HTTP这一块儿.可是闲得无聊时也会瞟两眼的.HTTP 2.0的 ...
- UVA 10859 - Placing Lampposts 树形DP、取双优值
Placing Lampposts As a part of the mission ‘Beautification of Dhaka City’, ...
- svn是什么
svn是什么 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Sub ...
- 【SDOI 2016】 排列计数
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4517 [算法] 有m个数在原来的位置上,说明有(n-m)个数不再原来的位置上 那么, ...
- POJ 1466 最大独立点集
思路:匈牙利 n-ans/2; // by SiriusRen #include <cstdio> #include <cstring> #define N 505 using ...
- 关于ubuntu中文输入调用不出来的解决办法,具体如正文。
卸载了 fcitx sudo apt-get remove fcitx 重启 sudo reboot 重新安装 fcitxsudo apt-get install fcitx 安装拼音输入法sudo ...
- java同步锁的正确使用
同步锁分类 对象锁(this) 类锁(类的字节码文件对象即类名.class) 字符串锁(比较特别) 应用场景 在多线程下对共享资源的安全操作. 需求:启动5个线程对共享资源total进行安全操作. 同 ...
- 使用 Travis-CI 的五个理由
I use the service of travis-ci now for a year. In that time the continuous integration has often poi ...