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函数被调用一次,但是返回两次,
随机推荐
- openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例
openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例 ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay. ...
- Gym 100418J Lucky tickets(数位dp)
题意:给定一个n.求区间[1, n]之间的全部的a的个数.a满足: a能整除 把a表示自身二进制以后1的个数 思路:题意非常绕.... 数位dp,对于全部可能的1的个数我们都dfs一次 对于某一个可 ...
- 【POJ 1733】 Parity Game
[题目链接] http://poj.org/problem?id=1 [算法] 并查集 [代码] #include <algorithm> #include <bitset> ...
- Java-SpringCloud:Spring Cloud 是什么
ylbtech-Java-SpringCloud:Spring Cloud 是什么 1.返回顶部 1. 一.概念定义 Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, ...
- java生成6位随机数的5种方法
转自:https://blog.csdn.net/u012491783/article/details/76862526/
- Google浏览器vim命令
使用鼠标久了,手腕.肩膀依旧疼痛.偶尔逛知乎,看到有人推荐chrome浏览器的vimium插件(火狐浏览器是vimperator),安装了使用了几天,真不愧是浏览器神器,好用到想哭,而且非常容易上手. ...
- Git 学习笔记(一)
某大牛曾经说过,版本控制的最大好处就是让你可以永远后悔,而 Git 无疑是众多版本控制软件当中的佼佼者,在开源社区更是备受青睐,那么它为何会诞生,和其他的版本控制软件项目又有什么不同?且让我们慢慢来看 ...
- 清北集训Day6T1(生成函数)
听rqy说可以用生成函数做,感觉比较有意思 我们考虑在DP转移的时候, $5,7,9$这三个数是没有限制的 因此他们出现的次数用01串表示的话就是$1111111111111111......$ $3 ...
- input 框输入数字相关
input框限制只能输入正整数,逻辑与和或运算 有时需要限制文本框输入内容的类型,本节分享下正则表达式限制文本框只能输入数字.小数点.英文字母.汉字等代码. 例如,输入大于0的正整数 代码如下: &l ...
- [ OS ][ Linux ] [ SA ] root 帳號名稱修改
1. 背景: 由於 Linux 中預設最高權限的使用者一律為 root, 存在安全性的疑慮. 所以比較安全的作法要將 root 帳號改名為其他名稱,讓要入侵的人需要同時破解出帳號和密碼才可以進入主機, ...