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

Linux:进程控制

前言:

在本篇文章中,我将带领大家来深入浅出的认识进程控制的概念,包括进程退出,进程等待,以及进程替换等知识。

进程退出:

进程退出是指计算机中正在运行的一个程序(即进程)结束其执行并释放所占用的系统资源的过程。

例如我们的main函数执行到结尾返回了0,此时代码执行完毕进程退出。而0其实是作为进程退出码返回给上层函数。

当我们一个进程结束时,分别有三种情况。

  1. 代码执行完毕,结果正常
  2. 代码执行完毕,结果不正常
  3. 代码异常终止

就好比,我们参加考试,当我们考了理想的成绩时,没人会问你为什么考了理想的成绩,这很奇怪。而我们考砸了就会问你为啥考砸,是不是哪里没发挥好。而第三种可能类似于考试作弊被发现提前终止考试。

所以当我们进程退出时,需要知道该进程的退出情况,而退出情况又是谁来获取呢?答案是Bash。而main函数的返回值通常是表明我们代码的执行情况。

进程退出码:

在Linux中我们可以使用echo $?来获取进程的退出情况。

进程退出码为0时,通常表示进程正常退出。当进程退出码大于0时,分别表示各种不同的错误。

exit函数与_exit函数:

当我们查看手册的时候,可以看到exit是3号手册,而_exit属于二号手册。三号手册属于库函数调用,二号手册属于系统调用。

在代码的任何地方调用exit函数表示,当代码执行到此的时候进程结束。

从上图实例可以看出,当我们使用exit函数时,程序结束会刷新缓冲区并且也得到了我们想要的退出码。但使用_exit 时候,发现并不会刷新缓冲区,程序直接退出。

进程等待:

进程等待是指进程在执行过程中,由于某些条件不满足而暂时停止执行,进入一种等待状态,直到所等待的事件发生或条件满足后,才会再次被唤醒并继续执行

进程等待是等谁?

进程等待是父进程去等待子进程结束后变成僵尸进程时去回收子进程的一个过程。就像之前说过当子进程进入僵尸状态时,就会刀枪不入,连 kill -9 命令也杀不死它。所以此时就需要进程等待。目的就是为了回收子进程资源以及信息,防止内存泄漏。

Waitpid():

waitpid函数用于进程管理的系统调用函数。其主要用途是等待子进程的状态发生改变,像子进程结束运行或者停止执行等,同时还能获取子进程的退出状态

Waitpid参数含义:

pid:该参数用于指定要等待的子进程,其取值有以下几种情况:

pid > 0:等待进程 ID 等于 pid 的子进程。 pid == -1:等待任意一个子进程,此情形下 waitpid 的作用和 wait 一样。

pid == 0:等待和调用进程处于同一进程组的所有子进程。

pid < -1:等待进程组 ID 等于 pid 绝对值的所有子进程。

status:这是一个指向整数的指针,用于存储子进程的退出状态信息。若不需要该信息,可将其设为 NULL。

options:该参数是一个位掩码,可使用 0 或者下面这些常量进行按位或运算来组合: WNOHANG:若没有子进程退出,函数不会阻塞,而是立刻返回 0。

WUNTRACED:若子进程因收到信号而停止,函数会返回。

WCONTINUED:若停止的子进程因收到 SIGCONT 信号而恢复执行,函数会返回。

通过上图实例演示可以看到,当子进程结束时,并没有出现僵尸 z 状态,而是直接被父进程给回收了。但如果我们自己想知道进程的退出码为多少时,就需要设置status。

获取子进程退出码:

想要获取子进程退出码时,使用WEXITSTATUS宏即可获取。

进程替换:

进程替换指的是一个正在运行的进程放弃当前执行的程序,转而执行另一个新的程序。替换后,新程序会占用原进程的资源,包括进程 ID、打开的文件描述符等,但会拥有全新的代码段、数据段和堆栈段,原进程的代码和数据将被完全覆盖。

程序替换简单来说,就是进程在执行代码的过程中,替换原有的代码和数据,但不会替换进程的其他数据。

Execl函数( ):

int execl(const char *path, const char *arg, ...);

execl函数中的第一个参数为新程序的路径名后续传递给新程序的第一个参数,通常是程序名本身。后续可以跟多个参数,最后一个参数必须为 NULL。Execl中的L表示list,表示以单链表形式传入。

可以看到程序输出了Hello,后就执行了ls命令后并没有输出world的语句。因为当执行到execl函数的时候,代码和数据就已经被替换了。

Execlp():

Execlp中p表示path。从上图可以看到,第一个参数只需要输入ls即可,但与第二个ls的意思完全不一样。第一个ls表示路径,第二个ls表示需要执行的程序名。

                                                                                ------本片文章就到这里了,谢谢大观看。

http://www.xdnf.cn/news/911.html

相关文章:

  • 《Learning Langchain》阅读笔记5-RAG(1)
  • 《作用域大冒险:从闭包到内存泄漏的终极探索》
  • 文字、语音、图片、视频四大领域的大模型、AI工具及其对比的详细分析及表格总结
  • 【Python】如何查找电脑上的Python解释器
  • C++编程指南38 - 使用 static_assert 检查类是否符合某个 concept
  • 极刻云搜-专业的软件网址搜索引擎
  • 基于Python(Django)+SQLite实现(Web)校园助手
  • redis常用的五种数据类型
  • DAY8:Oracle高可用架构深度解析与Data Guard单节点搭建实战
  • 在 macOS 上合并 IntelliJ IDEA 的项目窗口
  • Promise 原理、用法与在 Vue 中的最佳实践
  • XCTF-web(五)
  • Tez原理
  • 稳压二极管详解:原理、作用、应用与选型要点
  • 参加新手训练五十题平台 TUST-ACM实验室
  • python全栈-flask
  • 使用open3d将pcd点云按照颜色等级分块显示并令其随颜色变化播放
  • Java并发编程-线程通讯
  • 排序模型(Learning to Rank)
  • HarmonyOS-ArkUI:关键帧动画 keyFrameAnimateTo
  • 四、不确定性推理方法
  • 【项目日记(三)】
  • Linux-编辑器的使用
  • flutter 专题 六十三 Flutter入门与实战作者:xiangzhihong8Fluter 应用调试
  • 住宅 IP 加持,TikTok 多账号运营不受限
  • 【手机】vivo手机应用声音分离方案
  • 字节扣子空间开启内测!附免费邀请码!
  • STM32的BootLoader 从SD卡更新固件
  • 【Postgresql】Postgresql数据库设置免密码操作 免去每次输入密码登录Postgresql数据库 方便本地开发环境调试
  • 4399后端一面