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)代码如下图所示
(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 ...")。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android优化之电量优化的实现
基于spring cloud多个消费端重复定义feign client的问题
linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境
Java WebService 简单实例(附实例代码)
![](https://img.aspxhome.com/file/2023/8/64528_0s.png)
Android四大组件之Activity详解
![](https://img.aspxhome.com/file/2023/2/139552_0s.png)
C#图片按比例缩放的实现代码
Android开发实现模仿微信小窗口功能【Dialog对话框风格窗口】
![](https://img.aspxhome.com/file/2023/6/103906_0s.gif)
关于WPF异步MVVM等待窗体的介绍
![](https://img.aspxhome.com/file/2023/0/98190_0s.png)
spring的xml文件打开没有namespace等操作选项的解决方案
![](https://img.aspxhome.com/file/2023/4/66514_0s.jpg)
Android消息机制Handler深入理解
![](https://img.aspxhome.com/file/2023/0/88680_0s.jpg)
Android框架组件Lifecycle的使用详解
![](https://img.aspxhome.com/file/2023/9/91039_0s.png)
Android颜色配置器配置方法
![](https://img.aspxhome.com/file/2023/5/137855_0s.png)
实例讲解Java并发编程之闭锁
Quartz.Net使用方法详解
![](https://img.aspxhome.com/file/2023/5/94635_0s.jpg)
SpringBoot 整合 ElasticSearch操作各种高级查询搜索
Java SimpleDateFormat与System类使用示例详解
![](https://img.aspxhome.com/file/2023/4/78014_0s.png)
File.createTempFile创建临时文件的示例详解
![](https://img.aspxhome.com/file/2023/8/77448_0s.png)
重温C# clr 笔记总结
详细了解C语言二叉树的建立与遍历
![](https://img.aspxhome.com/file/2023/5/120785_0s.png)