什么是fork()

fork()是个system call用于建立新的进程,新建立的进程被称作子进程(child process),和父进程同时运行。

当子进程(child process)开始工作,子进程和父进程都会执行fork()之后的代码。子进程和父进程共享,程序计数器(Program counter,PC)寄存器(CPU registers)文件流(open files)等等。子进程和父进程可以通过这些共享的地方进行交流。

例子:

我们在程序中调用1次fork()会发生什么呢?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("Program Start\n");fork();printf("hello from: %d, my parent is: %d\n", getpid(), getppid());sleep(1);return 0;
}

我们可以看到子进程(2224)和父进程(2223)分别打出了各自的进程号和父进程号

父进程打印出了"Program Start"和"hello from: 2223, my parent is: 2103"

子进程打印出了"hello from: 2224, my parent is: 2223"

xx@xx:~/linux$ ./fork
Program Start
hello from: 2223, my parent is: 2103
hello from: 2224, my parent is: 2223

我们在程序中调用2次fork()会发生什么呢?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("Program Start\n");fork();fork();printf("hello from: %d, my parent is: %d\n", getpid(), getppid());sleep(1);return 0;
}

我们可以看到父进程打印出了"Program Start"和"hello from: 2246, my parent is: 2103"

被父进程生成的子进程1打印出了"hello from: 2248, my parent is :2246"

被父进程生成的子进程2打印出了"hello from: 2247, my parent is :2246"

那么为什么会有第四个"hello from: 2249, my parent is :2247"?

那是因为子进程1在执行下一行代码的时候调用了fork()。

所以被子进程1生成的子进程1_1打印出了"hello from: 2249, my parent is :2247"

xx@xx:~/linux$ ./fork
Program Start
hello from: 2246, my parent is :2103
hello from: 2248, my parent is :2246
hello from: 2247, my parent is :2246
hello from: 2249, my parent is :2247

讨论:

fork()实际做了些什么?

fork()实际上是父进程生成子进程,然后子进程自己调用了exec()和exit()。

(接下来还有更多讨论...)

什么是fork()?相关推荐

  1. 一个fork短码的扩展版本

    原本代码: 链接 int skip = !!fork() + 2*(!!fork()); for (uint32_t i=skip;i!=INT_MAX;i+=4) { } 这个是多进程加速循环的代码 ...

  2. Java fork join ForkJoinPool 用法例子

    本例是把一个大的数组求和的计算的大任务分解到在小范围内求和的小任务,然后把这些小任务之和加起来就是所求之结果. 技术:JDK8.0, Java fork-join模式下的RecursiveTask技术 ...

  3. Linux的fork实现原理,【Linux】Fork炸弹详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序 ...

  4. linux fork 目录,linux fork()理解

    各位同学,转换下思维,这里说的是"进程", 不是"线程",OK,我们开始 "进程"二字似乎总有那么些"只可意会不可言传" ...

  5. 【Linux】多线程中使用fork()

    (最核心的东西我在下面用红色字体标出来了,理解了那块,这些东西都是就理解了!) 在本篇文章开始之前,需要大家先了解线程和进程,这位大哥讲的言简意赅:进程和线程的主要区别(总结)_kuangsongha ...

  6. fork() || fork() || fork() 与 fork() fork() fork()

    先来看fork() || fork() || fork() #include<stdio.h> #include<unistd.h> #include<assert.h& ...

  7. 进程创建函数fork()和vfork()

    Linux下使用fork()创建一个新的进程,该函数不需要参数,返回值是一个进程id.对于不同的对象,分别是:新建的子进程id(返回给父进程),0(返回给创建的子进程)或者-1(子进程创建失败,返回给 ...

  8. c语言exit和return区别,在fork和vfork中使用

    转自c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: ...

  9. Linux环境编程--waitpid与fork与execlp

    waitpid waitpid(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t w ...

  10. java fork join原理_细说Fork/Join框架

    什么是Fork/Join框架? Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork就是把一个大 ...

最新文章

  1. 软件测试之功能测试详细过程
  2. 【Linux】25.ubuntu使用 nethogs 监测网络流量情况
  3. 论文阅读: Direct Monocular Odometry Using Points and Lines
  4. php mysql log文件,mysql log文件【读书笔记1】_MySQL
  5. Docker容器的生命周期管理
  6. 使用绘图类库flotr2来绘制HTML5的图形和图表
  7. Redis Java调用
  8. 逆序对(洛谷P1908题题解,Java语言描述)
  9. 我对架构的理解-概念篇
  10. ELK之ES-Logstash-Kibana互联
  11. [2018.10.10 T2] 烯烃
  12. ASM文件类型和模板
  13. Win10上装SAS
  14. 记录一次canvas小白做相册功能的过程
  15. HTML网页设计:五、行内元素和块元素
  16. 北大国际医院:基于互联网医疗的移动诊疗方案分析与设计
  17. 用.bat文件多开微信及打开固定浏览器浏览固定页面 开机自启
  18. 决策树,逻辑回归,PCA-算法面经
  19. 张蕾:北斗链将重新回到技术研发的道路上
  20. 详解软件项目管理流程的每一步

热门文章

  1. Java基础教程11-switch语句
  2. 动态规划DP (update)
  3. iOS:定位、地址和经纬度互转
  4. Matlab实现自适应动态规划多层神经网络的算例汇总
  5. pivot position_矩阵里的pivot是什么?请解释详细
  6. 怎么在打开查看的CAD图纸上插入OLE对象?
  7. 【学习笔记】数据库技术
  8. 【Matplotlib绘制图像大全】(一):条形图(柱状图)
  9. ES6转ES5 Traceur转码器
  10. taobao.trade.ordersku.update( 更新交易的销售属性 )