Linux系统中C语言编程创建函数fork()执行解析
最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下:
1.函数本身
(1)头文件
#include<unistd.h>
#include<sys/types.h>
(2)函数原型
pid_tfork(void);
(pid_t是一个宏定义,其实质是int被定义在#include<sys/types.h>中)
返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
(3)函数说明
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(childprocess)。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,子进程有了独立的地址空间。
2.代码执行解释
(1)代码如下图所示
(2)分析
由操作系统相关知识可知,进程是系统资源分配的基本单位,因此子进程与父进程不共享进程资源空间。在执行代码段第8行之前,系统中只有默认的主进程。在执行完代码段第8行后,系统中就有了两个进程,即主进程和由其创建的子进程。
创建子进程,fork()函数返回两个数值,若创建成功,子进程中返回0;父进程返回子进程ID。用资源空间图示如下:
执行了fork()函数后,主进程为父进程生成了一份资源空间的副本。主进程中的pid为子进程的pid(pid>0),子进程中的pid为0。
在fork()函数之后父进程与子进程都从下一行执行,即第9行。因为主进程中pid>0,可以执行elseif(pid>0)段代码,子进程pid=0,可以执行elseif(pid==0)段代码。
(3)代码执行结果如下:
可见,"Beforethefork..."只执行了一次。"Afterthefork..."执行了两次。
(具体的执行结果,可能会由于进程调度的不同,后面的四个输出顺序可能不同。不过第一个输出的一定是"Beforethefork...")。
相关文章
- Linux内存锁定技术深度剖析(linux锁内存)
- Linux下增加文件系统的技巧(linux增加文件系统)
- Linux切换PHP版本:快速而安全的方法(linux切换php版本)
- 调查:Linux 系统遭遇无法访问困境(linux无法被访问)
- 展示Linux系统磁盘分区之美(linux系统磁盘分区)
- 关闭Linux系统端口的方法(关闭端口linux)
- Linux 与 :结合使用,解锁更多可能(linux井号)
- 效能Linux系统实现最佳压缩性能(linux压缩最高)
- 配置Linux系统的默认路由(linux配置默认路由)
- Linux网络配置实验:系统实现与性能分析(linux网络配置实验报告)
- 探索Linux的魅力:实验篇(linux操作系统实验)
- Linux安装Run文件的步骤(linux安装run文件)
- 机操作系统Linux:变革计算机操作经典(linux计算)
- 使用Linux系统快速搭建服务器程序(linux服务器程序开发)
- 启动 Linux 防火墙关闭之路(关闭linux防火墙)
- Linux下性能测试:提升系统效能的利器(linux下性能测试)
- Linux分支:探索不同发行版(linux的分支)
- Linux发展史:从分支到成长(linux的分支)
- Linux查询:深入解读系统架构位数(查询linux的位数)
- 从U盘安装Linux,让电脑更智能(用u盘安装linux系统)
- 走向成功——北京Linux安全工程师的职业发展之路(北京linux安全工程师)
- 探索Linux系统中L命令的功能(linuxl命令)
- 解读Linux中vi编辑器的使用技巧(linux和vi)
- 构建高性能Linux系统:实现高效运行的实战技巧(高性能linux构建实战)
- Linux系统下驱动显卡的快速安装方法(linux装显卡驱动)
- 文档Linux系统下获取帮助文档(linux中帮助)
- 探索Linux世界:发掘字符之美(linux 字符)
- Linux查看C语言版本的方法(linux查看c 版本)
- Linux下使用新建目录命令让你轻松管理文件(linux新建目录命令)