一个现有的进程可以调用 fork 函数创建一个新进程。

#include <uinstd.h>
pid_t fork(void);// 返回值:子进程返回 0;父进程返回子进程 id;若出错,返回 -1

由 fork 创建的新进程被称为子进程(child process)。fork 函数被调用一次,但返回两次。两次返回的区别在于,子进程的返回值是0,二父进程的返回值是新创建的进程的 ID。

将子进程的 ID 返回给父进程的理由是:因为一个进程的子进程可以有多个,且没有一个函数使一个进程可以获得其所有子进程的进程 ID。

fork 使子进程返回值 0 的理由是:一个进程只会有一个父进程,所以子进程总是可以调用 getppid 来获取其父进程的进程 ID(进程 ID 0总是由内核交换进程使用,所以一个子进程的进程 ID 不可能为0).

子进程和父进程(均)继续执行 fork 调用之后的指令。子进程是父进程的副本。例如,子进程获得父进程的:

  • 数据空间(数据段)
  • 堆和栈的副本

注意,这些是子进程自己所拥有的副本,不是共享关系。子进程和父进程共享正文段(text)。

由于在 fork 之后经常跟着 exec(表示执行),所以现在的很多实现并不执行一个父进程数据段、栈和堆的完全副本(有点缓执行 lazy evaluation 的意思)。作为替代,使用了写时复制(Copy-On-Write,COW)技术。这些区域由父进程和子进程共享,而且内核将它们的访问权限改变为只读。如果父进程和子进程的任何一个试图这些区域,则内核只为修改区域的那块内存制作一个副本,通常是虚拟存储系统中的一“页”。

一个实例

#include "apue.h"char buf[] = "a write to stdout!";
int globvar = 6;int main(void){int var = 0;pid_t pid;if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)err_sys("write error!");if ((pid = fork()) < 0){err_sys("fork errror!");} else if (pid == 0) {++globvar;++var;} else {sleep(2);}printf("pid = %ld, globvar = %d, var = %d\n", (long)getpid(), globvar, var);return 0;
}

输出为:

a write to stdout!
before fork
pid = 9344, glob = 7, var = 1 // 子进程的变量值改变了
pid = 9343, glob = 6, var = 0 // 父进程的变量值未发生改变

一般来说,在 fork 之后是父进程先执行还是子进程先执行是不确定的,这取决于内核所使用的调度算法。如果要求父进程和子进程之间相互同步,则要求某种形式的进程间通信。上述程序中,父进程使自己休眠 2s,以此使子进程先执行。但并不保证 2s 已经足够。

UNIX 环境高级编程(八)—— fork 函数相关推荐

  1. 《Unix环境高级编程》学习笔记:从点到面

    以前在课堂上学习过<Unix初级教程(第四版)>,对于Unix有了一点了解.由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本<Unix环境高级编程>便 ...

  2. 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

    文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...

  3. 开发日记-20190827 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 3

    Referred Blogs 文件描述符标志,文件状态标志 Linux中文件描述符fd和文件指针flip的理解 Linux编程–文件描述符fd 文件共享 Unix支持在不同进程间共享文件. 内核使用了 ...

  4. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  6. 【UNIX环境高级编程】

    [UNIX环境高级编程] 环境搭建 1.下载源码 wget http://apuebook.com/src.3e.tar.gz 2.解压 tar -zxvf src.3e.tar.gz 3.安装lib ...

  7. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  8. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  9. UNIX环境高级编程-第三版

    Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...

  10. unix环境高级编程(上)-文件篇

    目录 前言 unix基础知识 unix标准化和实现 unix提供的文件IO 文件和目录 标准IO 系统数据文件 前言 笔者将<unix环境高级编程>主要内容总结为三篇:文件篇,进程篇,高级 ...

最新文章

  1. 黑鹰长期班.边程浪子系列教程
  2. python turtle画气球-菲菲用python编程绘制的父亲节礼物
  3. 管理和安装 chart - 每天5分钟玩转 Docker 容器技术(168)
  4. 靖江机器人怎么样_铁饭碗不保?靖江可能消失的12大职业!快看有你的工作没?...
  5. python 数据模型
  6. oracle select之后自动保存excel_Excel制作自动化仓库入库单,数据录入、计算、保存只需一键完成...
  7. js与python 抓包_Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程
  8. 理想汽车市值逼近蔚来,王兴曾多次在饭否为其站台
  9. [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis
  10. CTF攻防世界刷题51-
  11. 深入理解JVM虚拟机之内存管理
  12. 数据结构课程设计——通讯录制作
  13. BusHound详细使用说明
  14. 用计算机绘制工作表,实用计算机机械图样绘制技法
  15. 华为路由模拟器3.0参考实验7----直连路由无法ping通解决办法
  16. OpenCV实践之GMS网格运动统计策略的特征匹配算法
  17. python:TypeError:takes at least 8 arguments (9 given)
  18. 安全进化的终极猜想— 以“AI之盾”对抗“AI之矛”
  19. 笔记系列---------sqlnet.ora维护
  20. linux 个人云存储_2020年NAS首选,超高速读写备份,联想个人云存储A1深度体验

热门文章

  1. Java导出Excel 复杂表头
  2. ue4渲染速度太慢_技术汇丨如何在UE4中实现最佳性能和高质量视觉效果
  3. 1 linux下tcp并发服务器的几种设计的模式套路,Linux下几种并发服务器的实现模式(详解)...
  4. 深度学习TensorFlow生产环境部署(模型部署篇)
  5. Tableau可视化学习笔记:day03-04
  6. java actor和线程有什么区别_java – 在Akka Actors中使用OpenGL:保证单个线程用于特定的actor...
  7. js 打印出来的节点多了m_前端实用技术分享—用Vue实现打印指定区域
  8. Test on 2018.10.21
  9. 前台传JSON到后台
  10. 大白书中无向图的点双联通分量(BCC)模板的分析与理解