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创建多个子进程相关推荐

  1. fork()创建多个子进程

    fork()创建多个子进程 在学习linux中,老师布置了一个作业: 编写一段程序,使用系统调用fork)创建两个子进程.当此程序运行时,在系统中有一个父进程和两个子进程活动.让每一个进程在屏幕上显示 ...

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

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

  3. linux 两个子进程,父进程创建两个子进程,在收到中断信号后杀死两个子进程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键):捕捉到中断信号后,父进程用系统调用kill(  ...

  4. linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...

    综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...

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

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

  6. fork 循环创建多个子进程

    循环创建多个子进程 对于以下循环创建进程是什么样的呢? int i = 0; while(i < 3){fork();/*功能代码*/i++; } 子进程创建如下图 学习笔记 对于仅含有一个 f ...

  7. linux 创建子进程,linux中fork同时创建多个子进程的方法(一)

    Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { prin ...

  8. 父进程创建五个子进程

    父进程创建五个子进程 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys ...

  9. python中fork创建新的进程

    为了了解其中工作原理, 在结合linux的查看进程ps命令,对进程做了进一步的理解: 1.在linux下运行.py文件,系统就会创建一个进程 # coding=utf-8 from time impo ...

最新文章

  1. 菜鸟Vue学习笔记(三)
  2. 学python需要学数据库吗-学习Python爬虫前,你必须知道的一些工具!
  3. ++i和i++效率谁高
  4. SpringJunit测试类 BaseTest(转)
  5. 很多初接触乐鑫ESP32/ESP8266 模块时,都不清楚怎么为 ESP32、ESP8266 系列模组烧录固件呢?这里以启明云端WT8266-S5(ESP-12F)和ESP32-WROOM模块为例说明
  6. 多线程并发下的单例模式
  7. SpringBoot高级-任务-异步任务
  8. node函数 node路由
  9. 小米5如何支持ATT网络运营商
  10. 从底层来看函数的调用和返回
  11. 老马的原创空间搬家通告
  12. Rational Rose2003安装
  13. 使用 sed 替换字符串中最后一次出现的字符
  14. 河海大学计算机信息学院2013年考研录取名单,河海大学地学院2013年考研录取名单...
  15. 手写数字识别:CNN-AlexNet
  16. WIN10如何进入BIOS界面
  17. java.lang.NullPointerException: null的错误
  18. jQuery基础文档(持续更新)
  19. 矩阵论 - 7 - 求解Ax=0:主变量、特解
  20. 最近在关注冰岩作坊自己写的一个ftp的搜索

热门文章

  1. jquery GET POST
  2. 不使用物理引擎,自己动手做真实物理的模拟投篮游戏
  3. 【原创】MapReduce编程系列之表连接
  4. java动态拼接请求_在JavaWeb项目中处理静态文件或动态链接拼接网站地址的最优处理方案...
  5. mangouDB和mysql的区别_谈谈mongodb,mysql的区别和具体应用场景
  6. 日期加减加1天_2小时整理了13个时间日期函数,动图演示简单易学,收藏备用吧...
  7. java 图片去除黑边_根据 Map 上的变量绘制彩色和形状的点时,保持符号的黑色边框(geom_point)...
  8. linux运维笔试题目,linux运维相关的笔试题目_笔试题目
  9. 微信公招访问我服务器的那个端口,查看谁在使用某个网络端口
  10. 有关循环和判断的几个小问题