欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 【Linux手册】深度挖掘fork:子进程创建的关键细节与运行机制

【Linux手册】深度挖掘fork:子进程创建的关键细节与运行机制

2025/6/18 11:38:53 来源:https://blog.csdn.net/2401_87944878/article/details/148541861  浏览:    关键词:【Linux手册】深度挖掘fork:子进程创建的关键细节与运行机制

目录

前言

fork系统调用接口

fork基本介绍

fork调用结果演示

fork剖析

fork是干什么的

fork为什么要对子进程和父进程分别返回

fork是如何进行返回两次的

一个变量是如何存储不同内容的


前言

本文是继上一篇文章【Linux手册】从「程序」到「进程」:计算机世界的运行机制-CSDN博客,主要介绍如何使用fork创建子进程。在程序中要对多个任务同时处理,如服务器同时处理多个用户的请求;在运行一个程序的同时希望再生成一个新的程序。像这种多任务处理的情况是很常见的,都可以使用fork()系统调用接口来生成子进程,让子进程来完成新的要求。

fork系统调用接口

fork基本介绍

在学习一个函数的使用时,可以从参数,返回值,作用,实现原理这四个方面进行学习。

对于fork系统接口以下也将从这四个方面进行介绍。

  • 头文件:<unistd.h>
  • 作用:就是创建一个新的进程,新的进程被称为子进程,原来的进程被称为父进程。
  • 返回值类型pid_t,就是有符号整数,与int相同;如果子进程成功创建,在父进程中fork返回子进程的PID,在子进程中fork返回0;如果子进程没有创建成功就返回-1;
  • 没有参数。

fork调用结果演示

注意上面代码中的i的变换,在id>0中i++,在id==0中i+=2. 

以上是代码的实现,此代码仅仅是进行演示,无任何作用。

  • 根据上面的演示可以直观的看到程序同时进入和if和else;
  • 但是在根据后面打印的i会发现,在id>0的情况下打印的i每次加1,id==0的情况下打印的i每次加2,这两个i好像互相之间不影响,好像用的就是两个i一样。

对于这两种奇怪的现象在下面详细剖析fork你将会得到答案。

fork剖析

以下将围绕三个问题展开解释fork的工作原理。

fork是干什么的

fork就是用来创建一个新的进程,完成与当前进程不同的功能;

如果进程创建成功,新的进程被称为子进程,而原来的进程被称为父进程。子进程有自己的PID(如上图所示),也有自己的PPID,其PPID就是原来进程的PID,因为是父进程创建了这个进程

子进程是突然创建的,那它怎么运行,它有没有代码和数据???

是的,子进程是由父进程创建的,它没有自己的代码和数据,所以他要与父进程共有代码;

代码是公用的,那数据是共用的吗???

代码是共用的可以理解,代码在运行期间不会被修改吗,但是数据就不一样了,数据是有可能被修改的,比如上面动图中的i是在改变的,根据上面的i也能发现子进程中打印的i数据和父进程中的好像是独立的,这是不是意味着父进程将自己的数据拷贝一份给进程了???看看man手册中是这么说的。

fork使用的是写实拷贝:当子进程不对数据进行修改的时候就与父进程共用一个数据,当子进程需要对数据进行修改的时候再专门拷贝一份来供子进程进行修改。

通过写实拷贝可以让空间利用效率更高,对于不进行修改的数据不拷贝使得空间不会被大批量浪费。

fork为什么要对子进程和父进程分别返回

答:返回值不同是为了区分父进程和子进程,让不同的进程流去执行不同的代码;父进程中返回值>0,其实际上返回的是子进程的PID,这样就能让父进程找到子进程的属性信息。

fork是如何进行返回两次的

以下是fork系统接口的伪代码实现。

在fork系统调用接口返回之前就已经创建好了子进程,所以return ret是两个进程共享的,都会执行,所以两个进程都有返回值,返回值不同。

一个变量是如何存储不同内容的

如果使用一个变量进行接受fork的返回值;

pid_t id=fork();

 这就会使得id中存储不同的数据,这是怎么做到的???

根据前面所说的子进程对父进程的数据会进行写实拷贝父进程的返回值会直接写入id变量中,而子进程也有返回值,所以子进程也要写入id变量中,此时操作系统就会对id进行拷贝,再生成一份让子进程进行修改。实际上还是两个不同的变量在存储,而不是同一个id变量存储了两个不同的数据。

补充:父子进程都在运行,那么谁先运行呢???

这是不确定的,其取决于调度器(保证每个进程都能被公平调度)决定。 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com