引言

先来看一段代码吧,

 #include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h> int main(int argc, char **argv)
{
pid_t pid = fork();
if(pid < ){
fprintf(stderr,"error!");
}else if( == pid){
fprintf(stderr,"This is the child process.\r\n");
}else{
fprintf(stderr,"This is the parent process.\r\n");
}
return ;
}

执行后输出:

This is the parent process.

This is the child process.

是不是感觉比较奇怪,按照if结构的规则,应该只执行一个才对,也正因为此,fork()函数曾经迷惑了不少Linux/Unix平台的开发者。那么为什么呢?

一、函数原型

  pid_t fork( void);

  返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

二、函数说明

  一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父间子进程间不共享这些存储空。

  UNIX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。

  关键词:子进程中返回0  父进程中返回子进程ID(>0);调用一次返回两次;复制父进程地址空间内容(非地址)给子进程;子进程拥有独立的地址空间;无法确定执行顺序;

三、为何fork函数会返回两次

  先来看一个图:

  

  由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。调用fork之后,数据、堆栈有两份,代码仍然为一份但是这个代码段成为两个进程的共享代码段都从fork函数中返回,如上图箭头表示各自的执行处。当父子进程有一个想要修改数据或者堆栈时,两个进程真正分裂。

最新文章

  1. Outlook查找未读邮件
  2. C# 时间计算 今天、昨天、前天、明天 一个月的开始日期与结束日期
  3. 在where条件中使用CASE WHEN 语句
  4. div+css 遮罩层
  5. IP头部校验(转)
  6. [io PWA] Great libraries and tools for great Progressive Web Apps
  7. C#Css/Js静态文件压缩--Yui.Compressor.Net
  8. WSAEventSelect
  9. mongo export import
  10. maven的使用(基础1)
  11. 通过pycharm的Database设置进行数据库的可视化
  12. 【原创】Mac book pro入手后,需要做哪些才能开始开展自动化测试工作
  13. Ubuntu17.10安装Docker
  14. mercury水星路由wifi连接不上的坑
  15. 2012服务器在IIS部署的SLL(https)网址谷歌浏览器无法访问的问题解决
  16. VisualSVN Server 服务器搭建 和 TortoiseSVN的配置和使用方法
  17. ubuntu 18.04编译opencv3.4.3 with python3.6 cuda9.2 gdal
  18. Java入门知识1
  19. JS频率控制函数
  20. 如何利用 jQuery 修改 css 中带有 !important 的样式属性?

热门文章

  1. poj 1163 The Triangle 搜索 难度:0
  2. ural1469
  3. myeclipse设置jvm参数的三种方式
  4. selenium(三)浏览器操作
  5. flask+script命令行交互工具
  6. 一道sql 关于pivot的面试题
  7. php_os 检查php运行环境
  8. 萤石A1互联网报警盒子破解细节分析
  9. 解决Ubuntu下添加Log却无法输出(高通平台)
  10. 关闭所有的screen