当前位置: 首页 > article >正文

07 - 进程创建大盘点

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)Linux系统编程训练营 - 目录

文章目录

  • 1. 进程创建回顾
  • 2. 再论进程创建
    • 2.1 思考
    • 2.2 vfork()深度分析
    • 2.3 vfork()要点分析
    • 2.4 fork()的现代优化
    • 2.5 编程实验:fork() & vfork()
  • 3. exec与system简介
    • 3.1 exec函数家族
    • 3.2 进程创建库函数
    • 3.3 编程实验:system("./helloworld")

1. 进程创建回顾

在这里插入图片描述

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

2. 再论进程创建

  • fork()通过 完整复制 当前进程的方式创建新进程
  • execve()根据参数覆盖进程数据(一个不留)
    注释:如果fork后立马调用execve,那么没必要复制父进程的数据

在这里插入图片描述

  • pid_t vfork(void);
    • vfork()用于创建子进程,然而 不会复制 父进程空间中的数据
    • vfork()创建的子进程直接使用父进程空间(没有完整独立的进程空间)
    • vfork()创建的子进程对数据(变量)的修改会直接反馈到父进程中
    • vfork()是为了execve()系统调用而设计的

2.1 思考

下面的程序运行后会发生什么?
在这里插入图片描述

【参看链接】:07 - 进程创建大盘点 / 07 / 00vfork / main.c

在这里插入图片描述

2.2 vfork()深度分析

在这里插入图片描述

2.3 vfork()要点分析

  • vfork()成功后,父进程将等待子进程结束
  • 子进程 可以使用父进程的数据(堆、栈、全局
  • 子进程可以从创建点调用其它函数,但不要从创建点返回
    • 当子进程执行流回到创建点或者需要结束时,使用 _exit(0) 系统调用
    • 如果 使用 return 0 将破坏栈结构,导致后续父进程执行出错

【参看链接】:07 - 进程创建大盘点 / 07 / 01vfork / main.c

在这里插入图片描述

2.4 fork()的现代优化

  • Copy-on-Write技术
    多个任务访问同一资源时,在写入操作修改资源时,复制资源的原始副本
  • fork()引入Copy-on-Write之后,父子进程共享相同的进程空间
    • 当父进程或子进程的其中之一修改内存数据,则实时复制进程空间
    • fork() + execve() <==> vfork() + execve()

2.5 编程实验:fork() & vfork()

【参看链接】:07 - 进程创建大盘点 / 07 / 02

在这里插入图片描述

3. exec与system简介

3.1 exec函数家族

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【参看链接】:07 - 进程创建大盘点 / 07 / 03 / test.c

在这里插入图片描述

3.2 进程创建库函数

  • #include <stdlib.h>
  • int system(const char* command);
    • 参数:程序名及进程参数(如:pstree -A -p -s $$)
    • 返回值:进程退出状态

注释:system 首先会创建shell进程,效率比我们自己创建的create_process(…) 低

在这里插入图片描述
在这里插入图片描述

【参看链接】:07 - 进程创建大盘点 / 07 / 04 / test.c

在这里插入图片描述

3.3 编程实验:system(“./helloworld”)

【参看链接】:07 - 进程创建大盘点 / 07 / 05

在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/15122.html

相关文章:

  • C#获取视频第一帧_腾讯云媒体处理获取视频第一帧
  • 小鹏汽车嵌入式面试题及参考答案
  • Matplotlib | 理解直方图中bins表示的数据含义
  • Python设计模式详解之5 —— 原型模式
  • 解决 Spring Boot 中 `Ambiguous mapping. Cannot map ‘xxxController‘ method` 错误
  • Django5 2024全栈开发指南(三):数据库模型与ORM操作
  • JVM 垃圾回收算法
  • 网络安全常用术语
  • React--》Redux Toolkit的使用讲解
  • 快速入门量化交易
  • 数据库管理-第六十九期 另一种累(20230422)
  • 通用el-table 修改样式
  • 【QT5:CAN卡通信的上位机-代码练习-收发数据+布局+引用外部库+基础样例(1)】
  • C++高并发多线程学习
  • 使用QToolButton和QStackedWidget的侧边栏(SideBar)的实现与实现原理解析
  • 力扣---LeetCode88. 合并两个有序数组
  • 面试官:一千万的数据,你是怎么查询的?
  • 科学计算NumPy之Ndarray数组对象的创建、切片、索引、修改等操作汇总
  • 辨析 工作绩效数据、工作绩效信息、工作绩效报告
  • 浏览器环境线程之间的关系
  • C#非常实用的技巧
  • TCP/IP学习总结
  • Python学习之sh(shell脚本)在Python中的使用
  • 手机短信验证码登录功能的开发实录(机器识别码、短信限流、错误提示、发送验证码倒计时60秒)
  • 你不想成长,生活总会逼着你成长,阿里P8架构师分享十年学习生涯
  • 逻辑回归评分系统(mimic数据集)