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函数被调用一次,但是返回两次,
随机推荐
- POJ 1320
作弊了--!该题可以通过因式分解得到一个佩尔方程....要不是学着这章,估计想不到.. 得到x1,y1后,就直接代入递推式递推了 x[n]=x[n-1]*x[1]+d*y[n-1]*y[1] y[n] ...
- cocos2D(六)----CCLayer
一个游戏中能够有非常多个场景,每一个场景里面又可能包括有多个图层,这里的图层一般就是CCLayer对象.CCLayer本身差点儿没什么功能.对照CCNode,CCLayer可用于接收触摸和加速计输入. ...
- hadoop(八) - hbase集群环境搭建
1. 上传hbase安装包hbase-0.96.2-hadoop2-bin.tar.gz 2. 解压 tar -zxvf hbase-0.96.2-hadoop2-bin.tar.gz -C /clo ...
- 2016.03.27,英语,《Vocabulary Builder》Unit 06
equ: from Latin aequus, meaning 'equal', equalize:使相等; equivalent:[ɪ'kwɪvələnt], A is equivalent to ...
- When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向
链接:http://ucys.ugr.es/jnic2016/docs/MachineLearning_LiorRokachJNIC2016.pdf https://people.eecs.berke ...
- MySql悲观锁总结与实践
mysql(for update)悲观锁总结与实践 https://blog.csdn.net/zmx729618/article/details/52701972 悲观锁,正如其名,它指的是对数据被 ...
- SOAPUI 安装及破解
转自:https://blog.csdn.net/henni_719/article/details/79000130 先下载SOAPUI,我这里用的是5.1.2 PRO 版 下载路径:http:/ ...
- 在ubuntu下安装redis
最简单在线安装的方式: #安装Redis服务器端 ~ sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,我们检查Redis服务器程序 # 检查 ...
- 关于Java中equal函数和==的一些区别
equal函数比较的到底是什么,很明显是比较的值,但是什么值?与==比较的堆中的内存地址不同,其比较的是对象的值,包括各个属性的值.我们在重新overriding此方法时首先要判断是否为同一对象,如果 ...
- Android Finalizing a Cursor that has not been deactivated or closed
问题描述: 使用Sqlite数据库时,有时候会报下面的异常: Finalizing a Cursor that has not been deactivated or closed 一个光标没有被停用 ...