文章目录

  • 进程创建
  • 进程终止
  • 进程等待
  • 进程替换

进程创建

意义
进程运行时常会出现崩溃,为了避免父进程出现奔溃,则会创建子进程去代替父进程处理事务,即使崩溃并不会影响到父进程的正常运行,再创建一个子进程再次处理罢了。
用法:(man命令查相关命令及函数的具体用法)

fork() 创建子进程,父子进程虚拟地址空间独立
vfork() 创建子进程,并阻塞父进程,父子进程同用一块虚拟地址空间

返回值:子进程返回0;父进程返回子进程pid;出错返回-1

阻塞父进程:因为子进程和父进程分配到CPU的可能性是一样的,所以子进程与父进程谁先运行难以确定。但经过阻塞父进程后,子进程便先于父进程获取到CPU。
为什么要阻塞父进程:因为使用vfork()函数创建子进程时,父子进程共用同一块虚拟地址空间,因此共用同块栈去,如果不进行阻塞,会出现栈混乱的现象。

上一篇文章分析了进程创建的原理,链接如下:
https://blog.csdn.net/qq_44768163/article/details/115014661

进程终止

方法 接口 头文件 区别
exit 库函数调用接口 <stdlib.h> 退出后刷新缓冲区
_exit 系统调用接口 <unistd.h> 退出后并不刷新缓冲区
return 只能在main中使用 --------- 退出后刷新缓冲区


具体执行流程如下:

  1. printf打印的内容读入缓冲区
  2. 进入fun函数,退出调用该函数的的进程,并刷新缓冲区,输出------
  3. 使用echo $? 获取返回值99
    注:缓冲区的存在避免了频繁操作输出设备,使得输入内容存满后,再刷新缓冲区。。

进程等待

概念:
父进程等待子进程退出,获取退出子进程的退出返回值,释放子进程资源,避免产生僵尸进程
方法:

wait方法:(等待任意一个子进程退出)

返回值:成功- ->返回被等待进程pid;失败- ->返回-1;
参数:获取子进程退出状态- ->int *status;不关心子进程退出状态- ->置为NULL

waitpid方法:(等待任意一个子进程退出等待一个指定的子进程退出)

返回值:
            当正常返回的时候waitpid返回收集到的子进程的进程ID;
            如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
            如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
         pid:
                  Pid=-1,等待任一个子进程。与wait等效。
                  Pid>0.等待其进程ID与pid相等的子进程。
         status:
                 WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(用来查看进程是否是正常退出)
                 WEXITSTATUS(status): 若WIFEXITED非零(正常终止),提取子进程退出码。(用来查看进程的退出码)
          options:
                  0:表示默认阻塞等待
                  WNOHANG: 设置为非阻塞等待
阻塞等待:为了完成一个功能,发起调用,若当前不具备完成条件,则一直等待。
非阻塞等待:为了完成一个功能,发起调用,若当前不具备完成条件,则报错返回。eg:若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

实验:
wait方法

正常退出运行结果:

异常退出运行结果:(使用kill强杀依然属于正常退出,这里通过不创建子进程再等待即可模拟出等待失败返回-1的场景)

waitpid方法:

正常退出:

异常退出:

获取子进程的status

进程替换

其实有六种以exec开头的函数,统称exec函数:

#include <unistd.h>`
int execl(const char *path, const char *arg, …);//库函数
int execlp(const char *file, const char *arg, …);//库函数
int execle(const char *path, const char *arg, …,char *const envp[]);//库函数
int execv(const char *path, char *const argv[]);//库函数
int execvp(const char *file, char *const argv[]);//库函数
int execve(const char *path, char *const argv[], char *const envp[]);//系统调用函数

参数说明:
第一个参数:新的程序文件路径名
第二个参数:程序的运行参数
第三个参数:程序的环境变量

实验:

总结:

有没有p的区别:

在于程序文件是否需要带路径,有p时可以不带路径,但前提是该程序文件必须在PATH环境变量指定路径下。
有没有e的区别:
       在于程序是否自己设定环境变量,有e时自己设定环境变量(覆盖式设定,将之前已有的环境变量覆盖),没有e时,使用默认已有的环境变量。
l和v的区别:
       在于程序运行参数的赋予方式不同,l是一一列举传入,v是将运行参数列入数组中,整体传入

上图是进程替换的几种实现方式,分别对已有的ls程序文件和自定义实现的arg.c文件进行了替换实现,结果。。。。。。。。

进程创建-终止-等待-替换相关推荐

  1. 《Linux进程概念,进程创建退出等待替换,环境变量等基础操作 ---总结》

    前言 Linux系统的进程概念,进程状态,以及操作创建进程,还有环境变量及相关指令,程序地址空间等一些知识的梳理,将自己的理解总结如下,希望和各位一起进步,一起学习. 以下是本篇文章正文内容. 文章目 ...

  2. 【Linux】进程控制 —— 进程创建/终止/等待

    目录 一.进程创建 1.fork创建子进程,操作系统做了什么? 2.fork的用法以及失败的原因 二.进程终止 1.三种退出情况 2.main函数为什么一般情况下都要return 0 3.进程的退出码 ...

  3. c语言进程创建、等待和退出

    c语言进程创建.等待和退出 创建进程 fork()函数:函数返回值类型为pid_t 若程序运行在父进程中,函数返回的PID为子进程今年称号: 弱运行在子进程中返回PID为0. #include < ...

  4. Linux 进程控制(创建/退出/等待/替换)

    目录 进程创建 fork()函数 fork返回值 fork写时拷贝 fork失败原因 fork用法 进程退出 退出场景 常见的退出方法 正常退出 异常退出 _exit()系统调用 exit()函数 _ ...

  5. Linux 进程控制 :进程创建,进程终止,进程等待,程序替换

    进程创建 进程终止 进程等待 程序替换 进程创建 fork函数 创建一个子进程,父子进程代码共享,数据独有 #include <unistd.h> pid_t fork(void); 返回 ...

  6. Linux-进程控制详解(进程创建+进程终止+进程等待+进程程序替换)

    Linux进程控制 1. 进程创建 1.1 fork 1.2 vfork 2. 进程终止 3. 进程等待 3.1 为什么要进程等待 3.2 wait 3.3 waitpid 3.4 获取子进程退出信息 ...

  7. 【Linux】linux进程--进程控制:进程创建、进程终止、进程等待、进程程序替换

    目录 1.进程创建 1)重温fork():让正在运行的进程创建出来一个子进程:从已存在的进程中创建一个新的进程,新进程为子进程而远进程为父进程. 2)fork内部完成的事情 3)用户空间 & ...

  8. Linux:进程管理 | 进程创建 | 进程终止 | 进程等待 | 进程替换

    文章目录 进程创建 fork 写时拷贝机制 进程终止 退出码 进程退出方法 进程等待 阻塞.非阻塞的等待 进程替换 替换函数 exec l exec lp exec le exec ve exec v ...

  9. 【Linux】进程控制(进程创建、进程终止、进程等待、进程替换)

    文章目录 一.进程创建 1.1 系统调用 fork 1.2 理解 fork 的返回值 1.3 写时拷贝策略 二.进程终止 2.1 main 函数的返回值 2.2 进程退出的几种情况 2.3 进程退出码 ...

最新文章

  1. Sublime3快捷键大全
  2. ceph osd跟cpu进行绑定
  3. H5+JS+相对单位rem实现第三方支付页(输入金额+模拟数字键盘+自适应布局+大写金额)
  4. P2754 [CTSC1999]家园 / 星际转移问题(网络流)
  5. 金融时间序列计算分析题1
  6. java sender_Spring Boot用JavaMailSender发送邮件方法
  7. python plot linestyle 线型颜色及线条控制(linestyle、marker、color)
  8. [字符串]ASCII码表
  9. 【IoT】 产品研发:位深为1的BMP格式图片详解
  10. cityscape train.txt 数据 python读取子文件夹内所有文件
  11. 浏览器播放m3u8文件
  12. 期货手续费怎么计算?
  13. windows打印机 学习
  14. ubuntu14.04搜狗输入法中文无法切换英文
  15. 游戏手柄计算机,电脑游戏手柄怎么设置 电脑游戏手柄设置步骤【图文】
  16. MPLAB程序中如何设置配置字
  17. CodeForces - 89A - Robbery
  18. 广州土地市场有所回暖?分析广州房价,看看有什么新发现
  19. 你是弱者,又有什么了不起
  20. wrl文件转换成obj文件

热门文章

  1. 风投Placeholder的区块链价值观,了解一下
  2. 为什么是四次挥手不是三次挥手
  3. 如何用几何画板把圆奇数等分
  4. 云主机是什么?可以用来干嘛?
  5. SSM框架实现的垃圾分类管理系统+文档
  6. Laravel防范xss攻击
  7. ETHEREUM PET SHOP
  8. 经典非局部均值滤波(NLM)算法python实现(1)
  9. 【一步步学OpenGL 19】 -《镜面反射光》
  10. Pycharm导入scap包提示出错