C语言编程创建函数fork() 执行解析

  • |
  • 浏览:1842
  • |
  • 更新:2013-04-22 15:12
  • |
  • 标签:c语言

概述

最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下:

1.函数本身

(1)头文件

#include

#include

(2)函数原型

pid_t fork( void);

(pid_t 是一个宏定义,其实质是int 被定义在#include中)

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

(3)函数说明

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,子进程有了独立的地址空间。

2.代码执行解释

(1)代码如下图所示

(2)分析

由操作系统相关知识可知,进程是系统资源分配的基本单位,因此子进程与父进程不共享进程资源空间。在执行代码段第8行之前,系统中只有默认的主进程。在执行完代码段第8行后,系统中就有了两个进程,即主进程和由其创建的子进程。

创建子进程,fork()函数返回两个数值,若创建成功,子进程中返回0;父进程返回子进程ID。用资源空间图示如下:

执行了fork()函数后,主进程为父进程生成了一份资源空间的副本。主进程中的pid为子进程的pid(pid>0),子进程中的pid为0。

在fork()函数之后父进程与子进程都从下一行执行,即第9行。因为主进程中pid>0,可以执行else if(pid>0)段代码,子进程pid=0,可以执行else if(pid==0)段代码。

(3)代码执行结果如下:

可见,"Before the fork ..."只执行了一次。"After the fork ..."执行了两次。

(具体的执行结果,可能会由于进程调度的不同,后面的四个输出顺序可能不同。不过第一个输出的一定是"Before the fork ...")。

最新文章

  1. MVC 请求处理流程(一)
  2. Verilog学习笔记简单功能实现(一)...............D触发器
  3. [python] No module named _sysconfigdata_nd
  4. 如何创建和使用XMLHttpRequest对象?
  5. centos防火墙操作
  6. Android开发/源代码资源汇总
  7. 一次java程序的重构
  8. STL,ATL,WTL的联系与区别
  9. php代码20个实用技巧 ------ 转发自菜鸟教程
  10. sw代码问题
  11. 【JAVAWEB学习笔记】27_Redis:在Linux上的安装、Jedis和常用命令
  12. vue webuploader 组件开发
  13. 查看Page结构
  14. Python3基础教程1——Python的环境搭建
  15. SharePoint 添加BCD菜单
  16. fasthttp中的协程池实现
  17. Visual Studio Code快速删除空行及几个常用快捷键总结
  18. 基于三层架构项目下的Ado【六】
  19. gridcontrol 根据某一列数据来控制其他列合并
  20. spring与junit整合测试

热门文章

  1. js-json教程从入门到使用
  2. JavaScript的正则表达式
  3. 用VMware vSphere Client客户端登陆vsphere5提示错误
  4. Java 泛型 泛型方法
  5. ZOJ 3702 Gibonacci number
  6. Openjudge-计算概论(A)-求分数序列和
  7. C# 二维数组和集合
  8. xml 和json 数据格式及解析
  9. WIN2003 设置 OPENVPN 服务端
  10. Html5中的本地存储