进程创建大盘点

news2024/11/16 13:53:41

进程创建回顾

通过 fork() 创建子进程,然后通过 execve(...) 将子进程的进程空间替代为 path 所指定程序的进程空间,随后执行 path 所指定的程序

问题

进程创建是否只能依赖于 fork() 和 execve(...) ?

再轮进程创建

fork() 通过完整复制当前进程的方式创建新进程,execve() 根据参数覆盖进程数据 (一个不留)

我们在 fork() 之后,立即执行 execve() 的话,fork() 复制父进程进程空间的操作是多余的,因为 execve() 会覆盖复制出来的父进程进程空间

pid_t vfork(void);

vfork() 用于创建子进程,然而不会复制父进程中的数据

vfork() 创建出的子进程直接使用父进程空间 (没有完整独立的进程空间)

vfork() 创建的子进程对数据 (变量) 的修改会直接反馈到父进程中

vfork() 是为了 execve() 系统调用而设计

下面的程序运行后会发生什么?


#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char* argv[])
{   
    pid_t pid = 0;
    int var = 88;
    
    printf("parent = %d\n", getpid());
    
    if( (pid = vfork()) < 0 )
    {
        printf("vfork error\n");
    }
    else if( pid == 0 )
    {
        printf("pid = %d, var = %d\n", getpid(), var);
        var++;
        printf("pid = %d, var = %d\n", getpid(), var);
		
        return 0; /* destroy parent stack frame */
    }
    
    printf("parent = %d, var = %d\n", getpid(), var);
    
    return 0;
}

 程序运行结果如下图所示:

程序出现了段错误,崩溃了

程序崩溃是因为 vfork() 后,子进程和父进程共享同一个进程空间,第 31 行,子进程 return 0 之后,会从创建点返回,破坏栈结构,使得父进程的栈空间被破坏掉,从而导致程序崩溃

vfork() 深度解析

vfork() 使得子进程共享父进程的代码和数据

vfork() 要点分析

vfork() 成功后,父进程将等待子进程结束

子进程可以使用父进程的数据 (堆,栈,全局)

子进程可以从创建点调用其他函数,但不要从创建点返回

  • 当 子进程执行流 回到创建点 / 需要结束 时,使用 _exit(0) 系统调用
  • 如果使用 return 0 那么将破坏栈结构,导致后续父进程执行出错

vfork() 的正确使用


#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char* argv[])
{   
    pid_t pid = 0;
    int var = 88;
    
    printf("parent = %d\n", getpid());
    
    if( (pid = vfork()) < 0 )
    {
        printf("vfork error\n");
    }
    else if( pid == 0 )
    {
        printf("pid = %d, var = %d\n", getpid(), var);
        var++;
        printf("pid = %d, var = %d\n", getpid(), var);
		
        // return 0; /* destroy parent stack frame */
		_exit(0);
    }
    
    printf("parent = %d, var = %d\n", getpid(), var);
    
    return 0;
}

vfork() 后,子进程共享父进程的地址空间,父进程会等待子进程运行结束后,再向下运行

第 23 行,将 var 的值加一,此时 var = 89,这个变量的改动会影响到父进程,所以父进程中的 var = 89

第 27 行,_exit(0),使得子进程结束运行,并且不会从创建点返回

程序运行结果如下图所示:

 

fork() 的现代化技术

Copy-on-Write

  • 多个任务访问同一资源,在写入操作修改资源时,复制资源的原始副本

fork() 引入 Copy-on-Write 之后,父子进程共享相同的地址空间

  • 当父进程或子进程的其中之一修改内存数据,则实时复制进程空间
  • fork() + execve()  <=>  vfork() + execve()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/814824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金蝶云星空和旺店通·旗舰奇门单据接口对接

金蝶云星空和旺店通旗舰奇门单据接口对接 对接系统&#xff1a;旺店通旗舰奇门 旺店通是北京掌上先机网络科技有限公司旗下品牌&#xff0c;国内的零售云服务提供商&#xff0c;基于云计算SaaS服务模式&#xff0c;以体系化解决方案&#xff0c;助力零售企业数字化智能化管理升…

参数量仅有50KB的超轻量级unet变种网络egeunet【参数和计算量降低494和160倍】医疗图像分割实践

今天看到一篇挺有意思的文章&#xff0c;做的是跟医疗图像分割相关的工作&#xff0c;但是不像之前看到的一些工作一味地去追求高精度&#xff0c;因为医疗领域本身就是一个相对特殊的行业&#xff0c;对于模型产生的结果的精确性要求是很高的&#xff0c;带来的是参数量级的庞…

Pytorch深度学习-----神经网络之卷积层用法详解

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

交通运输安全大数据分析解决方案

当前运输市场竞争激烈&#xff0c;道路运输企业受传统经营观念影响&#xff0c;企业管理者安全意识淡薄&#xff0c;从业人员规范化、流程化的管理水平较低&#xff0c;导致制度规范在落实过程中未能有效监督与管理&#xff0c;执行过程中出现较严重的偏差&#xff0c;其营运车…

【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)

目录 一、初始化列表 ⭕初始化列表概念 ⭕初始化列表的优点 ⭕使用场景 ⭕explicit关键字 二、Static成员 ⭕Static成员概念 &#x1f534;静态数据成员&#xff1a; &#x1f534;静态函数成员&#xff1a; ⭕使用静态成员的优点 ⭕使用静态成员的注意事项 三、友…

国际化警告Fall back to translate ‘creator‘ key with ‘zn‘ locale.

发现是自己粗心写错了一个单词 这个需要改成zh

OC对象内存布局与isa指针

文章目录 一、Objective-C的本质二、一个objc对象如何进行内存布局&#xff1f;考虑父类的情况三、一个objc对象的isa指针指向什么&#xff1f;有什么作用四、objc对象的类方法和实例方法有什么本质区别和联系&#xff1f; 一、Objective-C的本质 Objc的底层实现是C\C代码&…

微信小程序tab加列表demo

一、效果 代码复制即可使用&#xff0c;记得把图标替换成个人工程项目图片。 微信小程序开发经常会遇到各种各样的页面组合&#xff0c;本demo为list列表与tab组合&#xff0c;代码如下&#xff1a; 二、json代码 {"usingComponents": {},"navigationStyle&q…

goctl template一定制化服务配置生成

官网介绍&#xff1a; 模板&#xff08;Template&#xff09;是数据驱动生成的基础&#xff0c;所有的代码&#xff08;rest api、rpc、model、docker、kube&#xff09;生成都会依赖模板&#xff0c; 默认情况下&#xff0c;模板生成器会选择内存中的模板进行生成&#xff0c…

easyui实用点

easyui实用点 1.下拉框&#xff08;input框只能选不能手动输入编辑&#xff09; data-options"editable:false"//不可编辑2.日期框&#xff0c;下拉框&#xff0c;文本框等class class"easyui-datebox"//不带时分秒 class"easyui-datetimebox"…

口碑+丨香港邮政联合极智嘉建立全港首个机器人邮包分拣系统

近日&#xff0c;香港邮政与全球仓储机器人引领者极智嘉(Geek)在其中央邮件中心联手建立全港首个机器人包裹分拣系统。该全新系统采用极智嘉分运结合解决方案&#xff0c;每小时可处理达1,000个邮包&#xff0c;助力香港邮政利用创新科技简化邮包分拣流程、提升工作效率&#x…

allwinner 全志RS485调试,GPIO状态与万用表测量不同

全志RS485调试 思路&#xff1a;UART驱动中已经将485流控功能加进去了&#xff0c;所以我们只需要根据硬件原理图配置一下485脚的GPIO就行了。 硬件原理图&#xff1a; 将UART3 UART4的RTS脚配置为485流控脚就行&#xff0c; RX和TX不需要配置&#xff0c;在pinctrol已经配置好…

热风梳C22.2 NO.3亚马逊加拿大审核标准

加拿大是目前亚马逊所有站点中&#xff0c;商业规模大、发展势头迅猛的站点之一。亚马逊加拿大站每月吸引近1600万访客。其优势在于在加拿大&#xff0c;目前平台的竞争较小&#xff0c;商家容易出单。既然加拿大站有这么多优势&#xff0c;那产品上架需要有哪些检测认证合规方…

[MAUI 项目实战] 手势控制音乐播放器: 手势交互

原理 定义一个拖拽物&#xff0c;和它拖拽的目标&#xff0c;拖拽物可以理解为一个平底锅&#xff08;pan&#xff09;&#xff0c;拖拽目标是一个坑&#xff08;pit&#xff09;&#xff0c;当拖拽物进入坑时&#xff0c;拖拽物就会被吸附在坑里。可以脑补一下下图&#xff1…

腾讯地图点标记加调用

先看效果 PHP代码 <?phpnamespace kds_addons\edata\controller;use think\addons\Controller; use think\Db;class Maps extends Controller {// 经纬度计算面积function calculate_area($points){$totalArea 0;$numPoints count($points);if ($numPoints > 2) {…

Qt、Qt Creator下载、安装

一、Qt、Qtcreator简介 Qt是一个跨平台应用开发框架。 Qt Creator是一个跨平台的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了Qt所提供的功能&#xff0c;可以单独下载使用&#xff0c;也可以结合Qt组合使用。 二、下载 下载地址&#xff1a;https://downloa…

2023 ChinaJoy | 移远通信携手高通,共创数字娱乐新体验

当前&#xff0c; 5G、AI、大数据等智能创新技术正以惊人的速度蔓延至越来越多的领域&#xff0c;从智能家居、智能交通、智能医疗到智能制造&#xff0c;改变了我们的工作和生活方式。 而在数字娱乐领域&#xff0c;智能创新技术也展现出了巨大的潜力。作为全球领先的物联网整…

13.5.5 【Linux】其他相关文件

除了前一小节谈到的 /etc/securetty 会影响到 root 可登陆的安全终端机&#xff0c; /etc/nologin 会影响到一般使用者是否能够登陆的功能之外&#xff0c;我们也知道 PAM 相关的配置文件在 /etc/pam.d &#xff0c;说明文档在 /usr/share/doc/pam-&#xff08;版本&#xff09…

牛客网Verilog刷题——VL47

牛客网Verilog刷题——VL47 题目答案 题目 实现4bit位宽的格雷码计数器。 电路的接口如下图所示&#xff1a; 输入输出描述&#xff1a; 信号类型输入/输出位宽描述clkwireIntput1时钟信号rst_nwireIntput1异步复位信号&#xff0c;低电平有效gray_outregOutput4输出格雷码计数…

管理ceph集群

文章目录 ceph的常用命令查看集群状态查看pg的状态查看mon节点状态查看osd的通用命令查看osd的容量查看osd池写入文件测试查看池的属性查看文件映射过程 添加磁盘删除磁盘 ceph的常用命令 查看集群状态 ceph osd pool application enable pool-name rbd #将池启用rbd功能 ceph…