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

时间:2023-06-21 01:10:03 

最近在看进程间的通信,看到了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)代码如下图所示

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

(2)分析

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

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

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

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

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

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

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

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

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

标签:C语言,fork
0
投稿

猜你喜欢

  • Android优化之电量优化的实现

    2023-08-20 07:57:25
  • 基于spring cloud多个消费端重复定义feign client的问题

    2022-09-18 11:34:23
  • linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境

    2022-07-04 07:02:37
  • Java WebService 简单实例(附实例代码)

    2023-01-25 07:52:18
  • Android四大组件之Activity详解

    2022-08-22 00:00:49
  • C#图片按比例缩放的实现代码

    2022-12-19 03:58:16
  • Android开发实现模仿微信小窗口功能【Dialog对话框风格窗口】

    2022-01-27 10:11:01
  • 关于WPF异步MVVM等待窗体的介绍

    2022-08-03 00:54:19
  • spring的xml文件打开没有namespace等操作选项的解决方案

    2022-09-10 14:56:47
  • Android消息机制Handler深入理解

    2023-03-13 13:44:04
  • Android框架组件Lifecycle的使用详解

    2022-08-01 08:48:59
  • Android颜色配置器配置方法

    2022-06-10 23:39:33
  • 实例讲解Java并发编程之闭锁

    2023-10-25 14:25:07
  • Quartz.Net使用方法详解

    2023-08-17 11:50:54
  • SpringBoot 整合 ElasticSearch操作各种高级查询搜索

    2023-03-25 17:12:40
  • Java SimpleDateFormat与System类使用示例详解

    2021-10-25 23:15:55
  • File.createTempFile创建临时文件的示例详解

    2022-05-03 08:52:41
  • 重温C# clr 笔记总结

    2023-06-22 02:24:30
  • 详细了解C语言二叉树的建立与遍历

    2021-08-17 10:24:01
  • java设置session过期时间的实现方法

    2022-02-18 20:25:29
  • asp之家 软件编程 m.aspxhome.com