fork创建多个子进程
references:
[1] how to create two processes from a single Parent
[2] fork() in C
[3] linux中fork同时创建多个子进程的方法
fork的本质,就是复制,把当前进程复制一份,然后两个进程并发地执行fork后面的语句,区别就是,子进程的fork返回值是0,父进程的fork返回值是子进程的pid,这也是区分父进程和子进程的方法,至于其他的内容,在fork之前的东西两个进程的一样的。
给出一个父进程和一个子进程的模板
int fd = fork();
if(fd < 0){exit(1);
} else if(fd == 0){// child code
} else {// father code
}
对于创建1个父进程和2个子进程,也是一样的道理
int fd1,fd2;fd1 = fork();
if(fd < 0){exit(1);
} else if(fd == 0){// child1 code
} else {fd2 = fork();if(fd2 < 0){exit(1);} else if(fd2 == 0){// child2 code} else {// father code}
}
先创建子进程1,然后父进程再继续执行,创建子进程2,最后,3个进程能够在框架内执行自己的代码。
这是最好用的框架,能够将3个进程都识别和区分开,不过如果创建n个子进程就会很麻烦。
因此,根据不同需求,也可以有别的写法
for(int i = 0; i < n; i++){int fd = fork();if(fd < 0){exit(1);} else if(fd == 0){// child i codebreak;} else {// father code}
}
最大作用的是break,保证子进程不会再进一步创建子进程。
然后其实子进程就可以干自己的事情了,比如执行个exec family
,执行其他进程什么的。
另外值得一说的是,如果父进程没有等待子进程结束之后再结束的话,shell就会出现显示错乱。
就像下面这样,但是仅仅是显示错乱而已,你可以直接正常输入命令的。
reference
[1] Using fork() in simplest form need to hit enter to finish execution
[2] Why do shells call fork()?
至于为什么,那是因为,当shell执行命令的之后,也会先创建一个子shell,然后执行exec,再执行你想要执行的命令,执行结束后,再返回当前的shell。
我们用shell执行了父进程,结束后返回,就显示ss@ss:$
了,而子进程仍然在执行,并且向shell输出了child process
,所以就造成了上面的局面,但是仅仅是显示问题而已,正常向shell输入命令就好。
fork创建多个子进程相关推荐
- fork()创建多个子进程
fork()创建多个子进程 在学习linux中,老师布置了一个作业: 编写一段程序,使用系统调用fork)创建两个子进程.当此程序运行时,在系统中有一个父进程和两个子进程活动.让每一个进程在屏幕上显示 ...
- Linux中fork()系统调用创建两个子进程
使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...
- linux 两个子进程,父进程创建两个子进程,在收到中断信号后杀死两个子进程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键):捕捉到中断信号后,父进程用系统调用kill( ...
- linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...
综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...
- linux编程两个子进程,Linux中fork同时创建多个子进程的方法
怎么创建多个进程呢?我说那还不容易,看下边代码: //省略必要头文件 int main() { pid_t pid[2]; int i; printf("This is %d\n" ...
- fork 循环创建多个子进程
循环创建多个子进程 对于以下循环创建进程是什么样的呢? int i = 0; while(i < 3){fork();/*功能代码*/i++; } 子进程创建如下图 学习笔记 对于仅含有一个 f ...
- linux 创建子进程,linux中fork同时创建多个子进程的方法(一)
Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { prin ...
- 父进程创建五个子进程
父进程创建五个子进程 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys ...
- python中fork创建新的进程
为了了解其中工作原理, 在结合linux的查看进程ps命令,对进程做了进一步的理解: 1.在linux下运行.py文件,系统就会创建一个进程 # coding=utf-8 from time impo ...
最新文章
- 菜鸟Vue学习笔记(三)
- 学python需要学数据库吗-学习Python爬虫前,你必须知道的一些工具!
- ++i和i++效率谁高
- SpringJunit测试类 BaseTest(转)
- 很多初接触乐鑫ESP32/ESP8266 模块时,都不清楚怎么为 ESP32、ESP8266 系列模组烧录固件呢?这里以启明云端WT8266-S5(ESP-12F)和ESP32-WROOM模块为例说明
- 多线程并发下的单例模式
- SpringBoot高级-任务-异步任务
- node函数 node路由
- 小米5如何支持ATT网络运营商
- 从底层来看函数的调用和返回
- 老马的原创空间搬家通告
- Rational Rose2003安装
- 使用 sed 替换字符串中最后一次出现的字符
- 河海大学计算机信息学院2013年考研录取名单,河海大学地学院2013年考研录取名单...
- 手写数字识别:CNN-AlexNet
- WIN10如何进入BIOS界面
- java.lang.NullPointerException: null的错误
- jQuery基础文档(持续更新)
- 矩阵论 - 7 - 求解Ax=0:主变量、特解
- 最近在关注冰岩作坊自己写的一个ftp的搜索
热门文章
- jquery GET POST
- 不使用物理引擎,自己动手做真实物理的模拟投篮游戏
- 【原创】MapReduce编程系列之表连接
- java动态拼接请求_在JavaWeb项目中处理静态文件或动态链接拼接网站地址的最优处理方案...
- mangouDB和mysql的区别_谈谈mongodb,mysql的区别和具体应用场景
- 日期加减加1天_2小时整理了13个时间日期函数,动图演示简单易学,收藏备用吧...
- java 图片去除黑边_根据 Map 上的变量绘制彩色和形状的点时,保持符号的黑色边框(geom_point)...
- linux运维笔试题目,linux运维相关的笔试题目_笔试题目
- 微信公招访问我服务器的那个端口,查看谁在使用某个网络端口
- 有关循环和判断的几个小问题