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返回了两个值.

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


相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...