5进程创建FORK
创始人
2024-04-08 09:42:45
0

文章目录

  • 1. fork函数初识
  • 2. fork函数返回值

1. fork函数初识

fork函数的作用从已存在的进程中创建一个新的进程,而新进程被称为子进程,原进程称为父进程,我们先看一下当执行fork后会发生什么.

  • 分配新的内存块和内核数据结构给子进程
  • 将父进程部分数据结构内容拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork返回,开始调度器调度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ua7kK5C4-1668515539934)(https://gitee.com/du-weiwei/typora/raw/master/image-20220311175555538.png)]

也就是说 当一个进程调用fork之后,就有两个二进制代码相同的进程,而且它们都从fork以后开始运行到相同的地方,即每个进程都将可以开始它们自己的旅程,如下程序:

#include 
#include 
#include 
int main()
{pid_t  pid;printf("before,pid=%d,ppid=%d\n",getpid(),getppid());pid = fork();  //创建子进程printf("after,pid=%d,ppid=%d\n",getpid(),getppid());return 0;
}

运行结果为

[MakeBigMoney@VM-12-5-centos ~]$ ./test 
before,pid=1390,ppid=29550
after,pid=1391,ppid=1390
after,pid=1390,ppid=29550

可以看到进程1390执行了beforeafter,进程1391也执行了after,但是1391却没有执行before,这是为什么呢?

用下图便可解释上面程序的原因:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fbyr8z1M-1668515539935)(https://gitee.com/du-weiwei/typora/raw/master/image-20220311175811031.png)]

所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器 决定。


2. fork函数返回值

fork函数有两个返回值

  • 给子进程返回0
  • 给父进程返回子进程的PID

那它为什么有两个返回值呢,在了解这个概念之前,我们先说一下写时拷贝.

一种写的时候才分配内存空间的拖延策略

说白了就是如果拷贝方对于被拷贝方的数据暂时只有读的需求时,变不开空间,直接用指针指向被拷贝方的空间,当需要写的时候才为其分配一块新的空间,关系如下:

而fork创建子进程时候,便是以父进程为模板,把代码和数据写时拷贝给子进程,根据这个原理,我们在按照这个思路进行理解下面的程序:

#include 
#include 
#include 
int main()
{pid_t  my_pid;printf("before,pid=%d,ppid=%d\n",getpid(),getppid());my_pid = fork();  //创建子进程printf("after,pid=%d,ppid=%d\n",getpid(),getppid());return 0;
}

一开始父进程执行到了fork位置并创建子进程,然后系统给子进程进行写时拷贝,子进程便拥有了一份和上面一模一样的代码.

fork调用结束,父子进程便可以开始自己的独立旅行,于是父进程代码的my_pid被赋值,同理!!!,子进程的my_pid这时候也需要被赋值,于是

系统便重新开辟一块空间给子进程,既然拥有了两个不同的my_pid,自然就有两个值了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uEE8tBfp-1668515539935)(https://gitee.com/du-weiwei/typora/raw/master/image-20220311213052411.png)]

(创建子进程过程如上图)

对于fork可以返回两个值的说法的理解,不如说是两个同名的变量各自接收了一份进程的数据而表现出来fork返回了两个值.

而写时拷贝从另一方面来说,也就保证了进程之间的独立性(因为需要写入的数据都各自私有了,互不影响)


相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...