unix中父进程如何获取子进程的终止状态
一、前言
本文将介绍在unix系统中,父进程如何获取子进程的终止状态。本文主要围绕如下函数展开:
1.wait
2.waitpid
3.waitid
4.wait3、wait4
在讨论这些函数前,先介绍一个进程从创建到释放子进程的过程。
二、子进程的创建以及终止
在unix系统中,一个进程可以通过fork()函数来创建一个新的进程。如果父进程先终止,那么子进程就会成为孤儿进程,然后被init进程收留,成为init进程的子进程。如果子进程先终止,那么内核就会向父进程发送一个SIGCHLD的信号,父进程默认忽略该信号。如果子进程终止后,父进程没有去获取子进程的终止状态,那么子进程就会在内存保存一段信息,成为僵死进程。
父进程通过wait族函数来获取子进程的终止状态。
三、wait族函数介绍
wait族函数的作用是获取子进程的终止状态。下面将详细介绍每个函数:
3.1 wait
#include <sys/wait.h> pid_t wait(int *status);
参数:用于存储子进程的退出状态,如果不关心状态,可以传入NULL 返回值:成功返回子进程的PID,出错返回0或-1
调用wait函数会有如下三种情况:
1.如果所有的子进程都在运行中,则父进程阻塞
2.如果一个子进程已经终止,正等待父进程获取其状态,则返回该子进程的PID
3.如果没有任何子进程,则立即报错返回
unix通过四个宏来获取子进程的退出状态,如下:
- WIFEXITED(status):用于判断子进程是否正常退出。如果是则返回真。
- WEXITSTATUS(status):获取正常退出的子进程的返回值。
- WIFSIGNALED(status):判断子进程是否因信号而终止。如果是则返回真。
- WTERMSIG(status):获取导致子进程终止的信号号码
- WIFSTOPPED(status):检查子进程是否被停止。
3.2 waitpid
waitpid的功能比wait更为丰富,它能指定等待某个特定的子进程结束,且能够选择是否阻塞。
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>pid_t waitpid(pid_t pid, int *status, int options);
参数:
pid:要等待的子进程的PID。如果是正数,则等待对应的子进程;如果是-1,则等待任意子进程;如果是0,则等待与调用进程同组的任意子进程。
status:用于存储子进程的退出状态
options:控制函数行为选项,比如WNOHANG(非阻塞等待)。返回值:成功的话返回被等待的子进程PID,没有匹配的子进程返回0,错误返回-1
3.3 waitid
waitid的功能和waitpid类似,只不过在传入参数上有些许差异。
#include <sys/types.h>
#include <sys/wait.h>int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
参入参数:
idtype: 指定要等待的进程 ID 类型,可以是以下值之一: P_PID: 等待指定进程的终止。
P_PGID: 等待指定进程组的终止。
P_ALL: 等待所有子进程的终止。
id: 取决于 idtype 的值。它可以是某个特定进程的ID,或是某个进程组的 ID,或是 0(针对所有子进程)。
infop: 是一个指向 siginfo_t结构体的指针,用于接收有关终止子进程的状态信息。
options: 控制函数行为的选项,使用方式类似于waitpid返回值:成功时返回0,出错返回-1
ps:需要注意的是WCONTINUE、WEXITED、WSTOPPED这三个参数之一必须在options中指定。
3.4 wait3、wait4
wait3和wait4和前面几个函数相比主要多了一个获取终止进程及其子进程所使用的系统资源的功能。
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <unistd.h>pid_t wait3(int *status, int options, struct rusage *rusage);
参数:
status:用于返回子进程的退出状态
options:控制调用的行为
rusage:指向 struct rusage的指针,用于获取子进程的资源使用情况
返回值:成功返回被等待的子进程的PID,失败返回-1========================================
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
wait4与wait3相比就增加了可以选择等待特定的子进程
struct rusage数据结构的定义如下:
#include <sys/resource.h>
struct rusage {
struct timeval ru_utime; // 用户 CPU 时间
struct timeval ru_stime; // 系统 CPU 时间
long ru_maxrss; // 最高常驻集大小(以 KB 为单位)
long ru_ixrss; // 增加的共享内存大小
long ru_idrss; // 增加的独占内存大小
long ru_isrss; // 增加的共享数据段大小
long ru_minflt; // 页面未命中数
long ru_majflt; // 页面错误数
long ru_nswap; // 交换区使用的次数
long ru_inblock; // 输入块数
long ru_oublock; // 输出块数
long ru_msgsnd; // 发送的消息数
long ru_msgrcv; // 接收的消息数
long ru_nsignals; // 发送的信号数
long ru_nvcsw; // 自愿上下文切换次数
long ru_nivcsw; // 非自愿上下文切换次数 };
四、参考代码
wait函数的参考代码如下:
/*************************************************************************> File Name: wait_test.c> Author: conbiao> Created Time: 2024年09月25日 星期三 11时14分36秒************************************************************************//************************************************************************ HEADER**********************************************************************/
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/resource.h>/************************************************************************ MACRO**********************************************************************/
#define WAIT3/************************************************************************ GLOBAL VARIABLE**********************************************************************//************************************************************************ FUNCTION DESCRIPTION**********************************************************************//***********************************************************************
* FUNCTION NAME:***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************//************************************************************************ MAIN**********************************************************************/
int main(int argc, char *argv[])
{int ret = 0;pid_t pid;int status;pid_t p;pid = fork();if(pid < 0){printf("fork fail!\n");}else if(pid == 0){printf("This is child process!\n");
#ifdef SIGNAL_EXITint x = 2 / 0;
#endifsleep(2);}else{
#ifdef WAITif((p = wait(&status))!= pid){printf("wait child error! pid: %d. p: %d \n",pid,p);}else{printf("This is father process,child process: %d\n",pid);}
#endif#ifdef WAITPIDif((p = waitpid(pid,&status,WNOHANG)) == pid){printf("This is father process,child process: %d\n",pid);}else{printf("p: %d\n",p);}
#endif#ifdef WAITIDsiginfo_t info;int res = waitid(P_PID,pid,&info,WEXITED);if(!res){printf("This is father process,child process:%d\n",pid);}else{printf("waitid fail! res: %d\n",res);}
#endif#ifdef WAIT3struct rusage rus;if(wait3(&status, 0 ,&rus) == pid){printf("This is father process,pid: %d,systime: %ld.%06ld seconds\n",pid, \(long)rus.ru_stime.tv_sec, (long)rus.ru_stime.tv_usec);}else{printf("wait3 fail!\n");}#endifif(WIFEXITED(status)){printf("child process over nomally,exit code is: %d\n",WEXITSTATUS(status));}else if(WIFSIGNALED(status)){printf("child process over by receive signal,signal is: %d\n",WTERMSIG(status));}}return ret;
}
运行结果如下:
(4-1)
参考资料:
《UNIX环境高级编程(第3版) (史蒂文斯 (W.Richard Stevens) 拉戈(StephenA.Rago))(Z-Library)》
相关文章:
unix中父进程如何获取子进程的终止状态
一、前言 本文将介绍在unix系统中,父进程如何获取子进程的终止状态。本文主要围绕如下函数展开: 1.wait 2.waitpid 3.waitid 4.wait3、wait4 在讨论这些函数前,先介绍一个进程从创建到释放子进程的过程。 二、子进程的创建以及终止 在unix…...
【ESP 保姆级教程】小课设篇 —— 案例:20240505_基于esp01s的局域网控制灯
忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2024-09-30 ❤️❤️ 本篇更新记录 2023-09-30 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝ὤ…...
Qt如何将外部窗口嵌入部件中
一、简述 今天给大家讲解的是使用QWindow类通过窗口句柄将外部的应用程序嵌入到我们的部件中来显示。在讲解之前可以延伸一下,当时项目中使用QProcess启动一些本地软件或者执行脚本时,需要将启动的第三方窗口嵌入到我们自己写的窗口中,此时我…...
2024年9月30日随笔
今天是国庆假期前的最后一天了,刚上完课,坐在实验室的工位前,感到焦虑又无奈,11月9号,网络规划工程师软考考试,学了一部分了,感觉有些难,还有一个月多一点点的时间,不知道…...
springboot+satoken实现刷新token(值变化)
欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 springbootsatoken实现刷新token satoken是什么?支持什么?为什么需要&…...
63.HDMI显示器驱动设计与验证-彩条实验
(1)常见的视频传输接口有三种: VGA 接口、 DVI 接口和 HDMI 接口,目前的显示设备都配有这三种视频传输接口。三类视频接口的发展历程为 VGA→DVI→HDMI。其中 VGA 接口出现最早,只能传输模拟图像信号; 随后…...
安卓13设置删除网络和互联网选项 android13隐藏设置删除网络和互联网选项
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1修改方法14.2修改方法25.编译6.彩蛋1.前言 有些客户不想让用户修改默认的网络配置,禁止用户进入里面调整网络相关的配置。 2.问题分析 像这个问题,我们有好几种方法去处理,这种需求一般…...
C++的6种构造函数
在 C 中,构造函数是一种特殊的成员函数,用于初始化类对象。在对象创建时自动调用,构造函数的主要作用是分配资源、初始化数据成员等。根据不同的功能和使用场景,C 提供了多种类型的构造函数: 1. 默认构造函数 (Defaul…...
【FE】NPM——概述
NPM基本使用 下载Node 老生常谈,选择LTS版本官网放这里:https://nodejs.cn/download/ 1.镜像配置:镜像源 镜像配置 依赖仓库:版本查看 //不确定仓库有哪些版本,列出指定包的所有版本 npm view <package-name&…...
Clipboard.js实现复制文本到剪贴板功能
一、Clipboard.js简介 Clipboard.js是一个轻量级的实现复制文本到剪贴板功能的JavaScript插件,该插件可以将输入框,文本域,DOM节点元素中的文本内容复制到剪贴板中。 官网地址:Clipboard.js 浏览器兼容性:兼容Chrome、…...
Harbor安装笔记
下载离线安装包 wget https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz 解压 tar -zxvf harbor-offline-installer-v2.11.1.tgz 复制一份配置文件出来,修改配置 cp harbor.yml.tmpl harbor.yml vim harbor…...
HTTP 1.0 2.0 3.0详解
HTTP HTTP全称超文本传输协议,是一种属于应用层的通信协议。它允许将超文本标记语言文档(HTML)从Web服务器传输到客户端的浏览器。 HTTP报文结构 请求报文结构 请求方法: GET:一般用来请求已被URI识别的资源&#x…...
Python操作TXT文本:从入门到精通
在数字化时代,文本处理成为了许多工作和项目的基础。Python作为一种强大且易学的编程语言,在文本处理方面展现出了无与伦比的优势。本文将通过举例的方式,向读者介绍如何使用Python来操作TXT文本,让您轻松掌握文本处理的精髓。 一、读取TXT文本内容 首先,我们需要学会如…...
开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的数据运营策略与价值创造
一、引言 1.1 研究背景 在当今数字化时代,数据运营已成为企业发展的核心驱动力。开源 AI 智能名片 21 链动模式 S2B2C 商城小程序作为一种创新的营销工具,与数据运营紧密相连。该小程序通过集成人工智能、大数据分析等先进技术,能够实时收集…...
ip 地址查看cmd命令
ip 地址查看cmd命令 在不同的操作系统中,查看IP地址的命令可能会有所不同。以下是一些常见操作系统中查看IP地址的命令: Windows: 打开命令提示符(CMD),然后输入 ipconfig 命令。 Linux/Unix: 打开终端࿰…...
力扣9.26
931. 下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即…...
HT8731 内置自适应H类升压和防破音功能的10W D类及AB类音频功率放大器
1、特点 防削顶失真功能(防破音,Anti-Clipping Function, ACF) 免滤波器数字调制,直接驱动扬声器 输出功率 10W(VBAT4.2V,RL3Ω,THDN10%, fiN 1kHz) 6W(VBAT3.3~4.2V,RL4Ω,THDN<1%,20-20kHz 全频段) 3W (VBAT3.3~4.2V,RL8Ω, THDN<1%, 20- 20kHz 全频段 VB…...
webpack使用
一、简介 概述 本次使用webpack4进行构建打包 二、webpack 安装webpack、webpack-cli npm install webpack4.2.0 webpack-cli4.2.0 -D 三、loader 加载器概述 raw-loader:加载文件原始内容(utf-8) file-loader:把文件输出…...
高通Android 12 音量API设置相关代码
// 获取当前音量大小public static int getCurrentVolume(Context context) {AudioManager audioManager (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);return audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); // 使用 STREAM_MUSIC 作为示例…...
Qt开发第一讲
一、Qt项目里面有什么? 对各个文件的解释: Empty.pro文件 QT core gui # 要引入的Qt模块,后面学习到一些内容的时候可能会修改这里 #这个文件相当于Linux里面的makefile文件。makefile其实是一个非常古老的技术了。 #qmake搭配.pr…...
详细指南:如何有效解决Windows系统中msvcp140.dll丢失的解决方法
如果你在使用Windows系统时遇到“msvcp140.dll丢失”的错误提示,通常是因为你的计算机上缺少或损坏了msvcp140.dll文件。msvcp140.dll是Microsoft Visual C Redistributable包的一部分,许多应用程序和游戏需要它来正常运行。以下是几种解决msvcp140.dll丢…...
【RabbitMQ】幂等性、顺序性
幂等性 概述 幂等性是数学和计算机科学中某些运算的性质,他们可以被多次应用,而不会改变初始应用的结果。RabbitMQ的幂等性则是指同一条消息,多次消费,对系统的影响是相同的。 一般消息中间件的消息传输保障分为三个层级&#…...
FFmpeg源码:avio_skip函数分析
AVIOContext结构体和其相关的函数分析: FFmpeg源码:avio_r8、avio_rl16、avio_rl24、avio_rl32、avio_rl64函数分析 FFmpeg源码:read_packet_wrapper、fill_buffer函数分析 FFmpeg源码:avio_read函数分析 FFmpeg源码ÿ…...
Llama 3.1 技术研究报告-6
6 推理 我们研究了两种主要技术,以使 Llama 3 405B 模型的推理⾼效:(1) 流⽔线并⾏和 (2) FP8 量化。我们已经公开发布了我们的 FP8 量化实现。 6.1 流⽔线并⾏ 当使⽤ BF16 数字表⽰模型参数时,Llama 3 405B 不适合在装有 8 个 Nvidia H1…...
更新日志-Python OS
这么久没更新全是因为这段时间的事情很多,只能一点一点的更新代码,不过好在,也是成功更新出来啦! 更新日志(2024/9/29) 代码全文更新,将所有的绝对路径替换为相对路径,这样在各位大…...
Chrome浏览器的C++内存管理技术揭秘
Chrome浏览器作为全球最流行的网络浏览器之一,其高效的内存管理技术功不可没。本文将深入探讨Chrome浏览器在C中的内存管理技术,并介绍如何通过调整网页加载时间、优化视频播放体验和解决谷歌浏览器占用CPU过高的问题来提升浏览器性能。 (本…...
Redis --- redis事务和分布式事务锁
redis事务基本实现 Redis 可以通过 MULTI,EXEC,DISCARD 和 WATCH 等命令来实现事务(transaction)功能。 > MULTI OK > SET USER "Guide哥" QUEUED > GET USER QUEUED > EXEC 1) OK 2) "Guide哥"使用 MULTI命令后可以输入…...
SQL,将多对多的关联记录按行输出
数据库的Primary表和Secondary表有相同的结构,其中W、H、D是主键。Primary表:NameWHDPrimary item 1100500300Primary item 2100600300Primary item 3200500300Primary item 4100500300Primary item 5100600300Primary item 6200500300 Secondary表&…...
【SQL】筛选字符串与正则表达式
目录 语法 需求 示例 分析 代码 语法 SELECT column1, column2, ... FROM table_name WHERE condition; WHERE 子句用于指定过滤条件,以限制从数据库表中检索的数据。当你执行一个查询时,WHERE 子句允许你筛选出满足特定条件的记录。如果记录满…...
【Redis入门到精通五】Java如何像使用MySQL一样使用Redis(jedis安装及使用)
目录 Jedis 1.jedis是什么 2.jedis的安装配置 3.jedis的基础命令操作展示 1.set和get操作: 2.exists和del操作: 3.keys和type操作: 4. expire和ttl: Jedis Java 操作 redis 的客⼾端有很多,其中最知名的是 jedi…...
自媒体专用网站免费/金华关键词优化平台
3.对数字进行全排列 使用itertools.permutations from itertools import permutations data_list permutations([1,2,3,4],2)#对数字1,2,3,4,进行两两组合,等同于全排列 for data in data_list: print(data) 结果 (1, 2) (1, 3) (1, 4) (2, 1) (2, 3) (2,…...
用fw做网站页面/b2b外链代发
设备:iOS10.3.2的5s一:设备越狱1.使用g0blin 进入官网下载ipa2.然后使用Impactor 安装到手机3.打开应用进行越狱。4.越狱安装OpenSSL和Openssh发现电脑链接不上,网上有个大神已经提出解决方案。a->首先卸载OpenSSL和Opensshb->在手机cy…...
网站你的后台管理系统用什么做/职业培训热门行业
在突发大量内存的请求期间,哪些工具或最佳实践可用于在Java服务中正常降级服务? 有问题的应用程序是多线程的。 处理每个请求所需的工作量可能相差很大,并且不容易拆分和并行化。我很担心编写与堆使用和GC有关的应用程序级代码,但…...
安全教育平台登录入口/优化大师免费安装下载
大多数人引荐Linux,基本上都会说Linux让你更高效、更优异。然而工具只是工具。然而工具只是工具。然而工具只是工具。优异程序员和不优异程序员的差异首先是态度上的差异。他们有自个的理想,考虑许多,不管是项目开端之前还是在项目进行中&…...
怎么做一个手机网站/搜索引擎分析论文
采用工具:maxwellKafkabirememaxwell:maxwell能实时解析MySQL的binlog,并输出json格式的数据发送到Kafka(还支持其它的消息中间件),具体参见:maxwell官网Kafka: 一种消息中间件,在该方案中主要用于消息中转…...
网站开发公司基础产品/网络推广怎么找客户资源
题目解决代码及点评 /************************************************************************/ /* 81. SHELL排序程序。 该方法的特征是:一个元素与它间隔…...