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

 更新时间:2013年04月11日 09:40:35   作者:  
最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下

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

1.函数本身

  (1)头文件

  #include<unistd.h>
  #include<sys/types.h>

  (2)函数原型

  pid_t fork( void);
  (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)
  返回值: 若成功调用一次则返回两个值,子进程返回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 ...")。

相关文章

  • C++实现产生随机数和相应的猜拳小游戏实例代码

    C++实现产生随机数和相应的猜拳小游戏实例代码

    C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand()。下面这篇文章主要给大家介绍了关于C++实现产生随机数和相应的猜拳小游戏的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • C++空类默认函数详细解析

    C++空类默认函数详细解析

    如果你只是声明一个空类,不做任何事情的话,编译器会自动为你生成一个默认构造函数、一个拷贝默认构造函数、一个默认拷贝赋值操作符和一个默认析构函数
    2013-10-10
  • C++实现LeetCode(169.求大多数)

    C++实现LeetCode(169.求大多数)

    这篇文章主要介绍了C++实现LeetCode(169.求大多数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言 循环详解及简单代码示例

    C语言 循环详解及简单代码示例

    本文主要介绍C语言的循环知识,这里整理了循环的基础资料并附简单的代码示例详细讲解,有需要的小伙伴可以参考下
    2016-08-08
  • Qt学习教程之对话框消失动画效果

    Qt学习教程之对话框消失动画效果

    这篇文章主要给大家介绍了关于Qt学习教程之对话框消失动画效果的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • C语言实现扫雷小游戏(适合初学者)

    C语言实现扫雷小游戏(适合初学者)

    这篇文章主要为大家详细介绍了C语言实现扫雷小游戏,适合初学者练习,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Opencv光流运动物体追踪详解

    Opencv光流运动物体追踪详解

    这篇文章主要为大家详细介绍了Opencv光流运动物体追踪的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++指向函数的指针实例解析

    C++指向函数的指针实例解析

    这篇文章主要介绍了C++指向函数的指针,需要的朋友可以参考下
    2014-07-07
  • C++ 写的UrlEncode和UrlDecode实例

    C++ 写的UrlEncode和UrlDecode实例

    这篇文章主要介绍了C++ 写的UrlEncode和UrlDecode实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 显示内存状态示例分享

    显示内存状态示例分享

    这篇文章主要介绍了显示内存状态示例,代码简单,下面直接看代码,需要的朋友可以参考下
    2014-02-02

最新评论