Linux_进程退出与进程等待

一、进程退出

  1. 退出场景

    • 正常终止‌:代码执行完毕且结果符合预期(退出码为 0)。
    • 异常终止‌:运行结果错误(退出码非 0)或进程被信号强制终止。(如 SIGINT 或 SIGSEGV)。
  2. 退出方法

    • 正常退出方式‌:
      • return:从 main 函数返回,隐含调用 exit 函数。
      • exit(int status):标准库函数,执行清理操作(如刷新缓冲区、调用 atexit 注册的函数)后终止进程。
      • _exit(int status):系统调用,直接终止进程,不刷新缓冲区。      

exit函数和_exit函数的区别

_exit  :立即终止进程,不执行任何清理操作

exit   :  调用清理函数、刷新缓冲区后终止进程

二、进程等待‌

为什么要有进程等待?

父进程在忙,子进程结束了,但无人回收,这样就造成了“死亡”的子进程一直占用资源

这个时候的子进程被称为“僵尸进程”

为了解决这个问题,最初的思路是:让父进程停下,等待子进程执行完,然后回

    • 回收资源‌:子进程退出后若未回收,将残留 task_struct 结构(僵尸进程)。
    • 获取状态‌:父进程需通过等待机制获取子进程的退出码或异常信号。

1、wait 函数参数解析 

pid_t wait(int *status);  

参数说明

  • status‌:
    • 类型为 int*,是输出型参数,用于接收子进程的终止状态(如退出码或终止信号)。
    • 若不关心子进程状态,可设为 NULL(如 wait(NULL)

返回值

  • 成功时返回终止的子进程 pid;
  • 无子进程或调用失败时返回

2、waitpid 函数参数详解 

pid_t waitpid(pid_t pid, int *status, int options); 
  1. 参数说明
    • pid‌:
      • > 0‌:等待指定 pid 的子进程;
      • -1‌:等待任意子进程(等价于 wait);
      • 0‌:等待与调用进程同进程组的所有子进程;
      • < -1‌:等待进程组 ID 为 |pid| 的任意子进程。
    • status‌:
      • 同 wait 的 status 参数,存储子进程终止状态。
    • options‌:
      • 0‌:默认阻塞模式;
      • WNOHANG‌:非阻塞模式,若指定子进程未结束则立即返回 0
      • WUNTRACED‌:支持作业控制,返回已暂停的子进程状态。
  2. 返回值
    • 成功时返回子进程 pid;
    • 若使用 WNOHANG 且无子进程终止,返回 0
    • 错误时返回 -1

waitpid 函数第二个参数详解

waitpid 函数的第二个参数 int *status 是用于接收子进程终止状态的关键参数,需配合特定宏解析具体信息。以下是详细说明:

tatus不能简单的当作整型来看,要从二进制的角度来看,32位下,整型转化为二进制有32个bit位,但是我们仅关注低16位

正常退出‌(子进程调用 exit 或 _exit):

if (WIFEXITED(status)) {  int exit_code = WEXITSTATUS(status);  // 提取低8位退出码(取值范围0~255):ml-citation{ref="2,4" data="citationList"}  
}  

信号终止‌(子进程被信号杀死): 

if (WIFSIGNALED(status)) {  int signal_num = WTERMSIG(status);    // 提取终止信号编号(如 SIGKILL=9):ml-citation{ref="4,7" data="citationList"}  printf("Terminated by signal: %d\n", signal_num);  
}  

暂停状态‌(需配合 WUNTRACED 选项): 

if (WIFSTOPPED(status)) {  int stop_signal = WSTOPSIG(status);   // 提取暂停信号编号(如 SIGSTOP=19):ml-citation{ref="4,7" data="citationList"}  
}  

status 的二进制位分布:  

 

 

  • WIFEXITED(status):判断子进程是否正常退出(返回非零值时表示正常退出)。
  • WEXITSTATUS(status):若子进程正常退出,通过此宏获取子进程的退出码(如 exit(5) 中的 5)。
  • WIFSIGNALED(status):判断子进程是否因信号终止(返回非零值时表示被信号终止)。
  • WTERMSIG(status):若子进程因信号终止,通过此宏获取信号代码(如 SIGKILL 对应 9

 ‌可忽略性
若父进程不关心子进程状态,可将参数设为 NULL,此时仅等待子进程结束而不获取状态信息 

关键细节

  • 指针的必要性‌:必须传递地址(如 &status),操作系统需要写入状态值到该地址。
  • 状态位结构‌:status 的整数值包含多个信息位,需通过宏函数按需提取。
  • 与 wait 的关系‌:wait(&status) 等价于 waitpid(-1, &status, 0),二者的 status 解析方式一致

 

 

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

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

相关文章

GD32F407单片机开发入门(二十八)USB口介绍及CDC类虚拟串口通讯详解及源码

文章目录 一.概要二.USB2.0基本介绍及虚拟串口介绍三.GD32单片机USB模块框图四.GD32单片机USB设备模式五.GD32F407VET6 USB设备CDC类六.配置一个USB虚拟串口收发例程七.工程源代码下载八.小结 一.概要 GD32F407VET6USB虚拟串口是一种采用GD32F407VET6单片机&#xff0c;通过US…

MySQL 主从配置超详细教程

文章目录 前言一、安装 MySQL二、主服务器&#xff08;Master&#xff09;配置三、从服务器&#xff08;Slave&#xff09;配置四、测试主从复制五、注意事项 前言 MySQL 主从配置是一种实用的数据库架构&#xff0c;主服务器处理写入操作&#xff0c;从服务器负责只读操作&am…

Python爬虫实战:获取百度学术专题文献数据并分析,为读者课题研究做参考

一、引言 在信息爆炸的当下,学术研究需要大量相关资料支撑。百度学术作为重要学术资源平台,蕴含丰富学术文献。利用爬虫技术获取百度学术特定主题文章数据,能为学术研究提供全面、及时信息。本研究旨在用 Python 实现对百度学术 “主题爬虫” 相关文章的爬取,并对数据深入…

手撕基于AMQP协议的简易消息队列-6(服务端模块的编写)

在MQServer中编写服务端模块代码 在MQServer中编写makefile文件来编译服务端模块 .PHONY: server CFLAG -I../ThirdLib/lib/include LFLAG -L../ThirdLib/lib/lib -lgtest -lprotobuf -lsqlite3 -pthread -lmuduo_net -lmuduo_base -lz server:server.cpp ../MQCommon/messag…

linux tar命令详解。压缩格式对比

1.压缩格式对比 压缩格式命令选项文件扩展名压缩率速度无压缩-cvf.tar无最快gzip-czvf.tar.gz中等较快bzip2-cjvf.tar.bz2较高较慢xz-cJvf.tar.xz最高最慢 9. 更多参考 【Linux基础】文件压缩tar命令指南tar压缩方式对比

解锁跨平台开发的新时代——Compose Multiplatform

解锁跨平台开发的新时代——Compose Multiplatform 在当今移动和桌面应用程序开发领域,跨平台解决方案是开发者们梦寐以求的工具。而由JetBrains打造的Compose Multiplatform正是这样一款现代UI框架,它基于Kotlin技术,为开发者构建高性能且美观的用户界面提供了极大的便利和…

【算法学习】递归、搜索与回溯算法(二)

算法学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在&#xff08;一&#xff09;中我们挑了几个经典例题&#xff0c;已经对递归、搜索与回溯算法进行了初步讲解&#xff0c;今天我们来进一步讲解…

HTTP请求与缓存、页面渲染全流程

文章目录 前言**1. HTTP请求与缓存处理****缓存机制**• 强缓存&#xff08;Cache-Control / Expires&#xff09;• 协商缓存&#xff08;Last-Modified / ETag&#xff09; **2. 服务器响应与数据解析****3. HTML DOM 构建****4. CSSOM 构建****5. 渲染树&#xff08;Render …

限流算法学习笔记(一)Go Rate Limiter

文章目录 1. 背景与概述1.1 什么是速率限制1.2 Go Rate Limiter 的定义与价值 2. 核心思想与设计理念2.1 令牌桶算法的基本原理2.2 惰性评估设计2.3 多种处理策略的平衡2.4 简单易用的偶发控制 3. 架构设计与组件3.1 整体架构3.2 Limiter 组件3.3 Reservation 组件3.4 Limit 类…

n8n工作流自动化平台的实操:生成统计图的两种方式

1.成果展示 1.1n8n的工作流 牵涉节点&#xff1a;Postgres、Code、QuickChart、Edit Fields、HTTP Request 12.显示效果 2.实操过程 2.1节点说明 2.1.1Postgres节点&#xff1a; 注&#xff1a;将明细数据进行汇总。 2.1.2code节点&#xff1a; 注&#xff1a;将 查询的数…

JavaScript中数组和对象不同遍历方法的顺序规则

在JavaScript中&#xff0c;不同遍历方法的顺序规则和适用场景存在显著差异。以下是主要方法的遍历顺序总结&#xff1a; 一、数组遍历方法 for循环 • 严格按数组索引顺序遍历&#xff08;0 → length-1&#xff09; • 支持break和continue中断循环 • 性能最优&#xff0c;…

缓存(1):三级缓存

三级缓存是指什么 我们常说的三级缓存如下&#xff1a; CPU三级缓存Spring三级缓存应用架构&#xff08;JVM、分布式缓存、db&#xff09;三级缓存 CPU 基本概念 CPU 的访问速度每 18 个月就会翻 倍&#xff0c;相当于每年增⻓ 60% 左右&#xff0c;内存的速度当然也会不断…

Android setContentView()源码分析

文章目录 Android setContentView()源码分析前提setContentView() 源码分析总结 Android setContentView()源码分析 前提 Activity 的生命周期与 ActivityThread 相关&#xff0c;调用 startActivity() 时&#xff0c;会调用 ActivityThread#performLaunchActivity()&#xf…

uniapp自定义步骤条(可二开进行调试)

前言 有一个业务需求是需要一个步骤条&#xff0c;但是发现开源的都不太合适&#xff0c;所以就自己写了一个。 开始 test.vue <template><view class"authenticateRecordDetails_container"><!-- 进度 --><view class"authenticateSte…

22、近端策略优化算法(PPO)论文笔记

近端策略优化算法&#xff08;PPO&#xff09;论文笔记 一、研究背景与目标二、**方法****3.1 策略梯度基础****3.2 信任区域方法&#xff08;TRPO&#xff09;****3.3 剪切代理目标函数&#xff08;LCLIP&#xff09;****3.4 自适应KL惩罚系数****3.5 算法实现** 三、 L CLIP…

web 自动化之 Selenium 元素定位和浏览器操作

文章目录 一、元素定位的八大方法1、基于 id/name/class/tag_name 定位2、基于 a 标签元素的链接文本定位3、基于xpath定位4、css定位 二、浏览器操作1、信息获取2、 浏览器关闭3、 浏览器控制 一、元素定位的八大方法 web 自动化测试就是通过代码对网页进行测试&#xff0c;在…

前端面经 作用域和作用域链

含义&#xff1a;JS中变量生效的区域 分类&#xff1a;全局作用域 或者 局部作用域 局部作用域&#xff1a;函数作用域 和 块级作用域ES6 全局作用域:在代码中任何地方都生效 函数中定义函数中生效&#xff0c;函数结束失效 块级作用域 使用let或const 声明 作用域链:JS查…

【C/C++】RPC与线程间通信:高效设计的关键选择

文章目录 RPC与线程间通信&#xff1a;高效设计的关键选择1 RPC 的核心用途2 线程间通信的常规方法3 RPC 用于线程间通信的潜在意义4 主要缺点与限制4.1 缺点列表4.2 展开 5 替代方案6 结论 RPC与线程间通信&#xff1a;高效设计的关键选择 在C或分布式系统设计中&#xff0c;…

两种方法求解最长公共子序列问题并输出所有解

最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是动态规划领域的经典问题&#xff0c;广泛应用于生物信息学&#xff08;如DNA序列比对&#xff09;、文本差异比对&#xff08;如Git版本控制&#xff09;等领域。本文将通过​​自顶向下递归记忆化​​…

SpringBoot应急知识学习系统开发实现

概述 一个基于SpringBoot开发的应急知识学习系统&#xff0c;该系统提供了完整的用户注册、登录、知识学习与测评功能。对于开发者而言&#xff0c;这是一个值得参考的免费Java源码项目&#xff0c;可以帮助您快速构建类似的教育平台。 主要内容 5.2 注册模块的实现 系统采…