【Linux】深入探讨Linux进程等待:`waitpid`与`wait`

文章目录

      • 深入探讨Linux进程等待:`waitpid`与`wait` API
        • 一、`waitpid`与`wait`简介
          • 1. `wait`
          • 2. `waitpid`
        • 二、`waitpid`与`wait`的实际应用
          • 1. 基本用法示例
          • 2. 使用 `waitpid` 处理多个子进程
          • 3. 非阻塞等待
        • 三、使用场景

深入探讨Linux进程等待:waitpidwait API

在Linux操作系统中,进程管理是核心功能之一。为了实现进程的同步与控制,Linux提供了一系列的系统调用(API),其中waitpidwait是用于进程等待的重要工具。

一、waitpidwait简介
1. wait

wait 是一个用于等待任一子进程终止的系统调用。父进程调用wait后会被挂起,直到它的某个子进程终止,操作系统会将子进程的退出状态返回给父进程。如果没有子进程,wait 会立即返回。

函数原型:

pid_t wait(int *status);

参数:

  • status:用于存储子进程的终止状态。如果不关心子进程的退出状态,可以将其设置为 NULL

返回值:

  • 正常返回时,wait 返回终止的子进程的PID;如果出错,返回 -1,并设置 errno 来指示错误原因。
2. waitpid

waitpidwait 的增强版,它允许父进程等待一个特定的子进程,并提供更多的控制选项。父进程可以指定等待特定子进程或任何子进程终止,还可以设置非阻塞模式来避免挂起。

函数原型:

pid_t waitpid(pid_t pid, int *status, int options);

参数:

  • pid:指定要等待的子进程ID。特殊值 -1 表示等待任何子进程;0 表示等待与调用进程处于同一进程组的任何子进程;> 0 表示等待指定的子进程。
  • status:与 wait 类似,用于存储子进程的终止状态。
  • options:可选参数,用于设置等待行为,如 WNOHANG(非阻塞模式)和 WUNTRACED(等待未终止但已停止的子进程)。

返回值:

  • 返回终止的子进程的PID。如果使用了 WNOHANG 选项并且没有子进程终止,waitpid 返回 0;如果出错,返回 -1
二、waitpidwait的实际应用
1. 基本用法示例

以下是一个使用 waitwaitpid 的基本示例,展示如何等待子进程终止并获取其退出状态。

#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程printf("Child process: PID = %d\n", getpid());_exit(0);  // 立即退出} else if (pid > 0) {// 父进程int status;pid_t child_pid = wait(&status);  // 或者使用 waitpid(pid, &status, 0);if (WIFEXITED(status)) {printf("Child process %d exited with status %d\n", child_pid, WEXITSTATUS(status));}} else {// fork 失败perror("fork");return 1;}return 0;
}
2. 使用 waitpid 处理多个子进程

在实际开发中,父进程通常会创建多个子进程进行并行任务处理。使用 waitpid 可以更精确地控制每个子进程的等待和回收。

#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>int main() {for (int i = 0; i < 3; ++i) {pid_t pid = fork();if (pid == 0) {// 子进程printf("Child %d: PID = %d\n", i, getpid());sleep(2);  // 模拟工作_exit(i);  // 返回子进程号作为状态}}// 父进程:等待所有子进程int status;pid_t pid;while ((pid = waitpid(-1, &status, 0)) > 0) {if (WIFEXITED(status)) {printf("Child process %d exited with status %d\n", pid, WEXITSTATUS(status));}}return 0;
}
3. 非阻塞等待

使用 waitpid 时,父进程可以通过 WNOHANG 选项来避免阻塞,从而在不阻塞的情况下检查子进程的状态。

#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程sleep(5);  // 模拟长时间任务_exit(0);} else if (pid > 0) {// 父进程:非阻塞等待int status;while (1) {pid_t result = waitpid(pid, &status, WNOHANG);if (result == 0) {printf("Child still running...\n");sleep(1);} else if (result == -1) {perror("waitpid");break;} else {printf("Child process %d exited with status %d\n", pid, WEXITSTATUS(status));break;}}} else {// fork 失败perror("fork");return 1;}return 0;
}
三、使用场景
  1. 避免僵尸进程:如果父进程没有回收子进程的退出状态,子进程会成为僵尸进程,长期占用系统资源。通过及时调用 waitwaitpid 可以避免僵尸进程的出现。

  2. 使用非阻塞等待:在某些需要保持父进程响应的场景,如服务器进程中,可以使用 WNOHANG 选项实现非阻塞等待。

  3. 信号处理:在复杂的系统中,信号处理机制(如 SIGCHLD 信号)可以与 waitpid 结合使用,自动处理子进程的终止事件。

  4. 处理多个子进程:如果父进程管理多个子进程,建议使用 waitpid 而非 wait,以便更精确地控制各个子进程的回收。

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

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

相关文章

Java基础——自学习使用(泛型)

一、泛型的定义 泛型的本质是参数化类型&#xff0c;也就是所操作的数据类型被指定为一个参数。 泛型泛指一切类型&#xff0c;能够代表一切类型&#xff0c;是一种在编程中广泛使用的概念&#xff0c;特别是在面向对象编程中。它允许在编写代码时使用类型参数&#xff0c;这些…

WPS Office两个严重漏洞曝光,已被武器化且在野利用

WPS Office作为一款用户基数超过2亿的广泛使用的办公套件&#xff0c;被发现存在两个关键漏洞&#xff08;CVE-2024-7262和CVE-2024-7263&#xff09;&#xff0c;这些漏洞可能导致用户遭受远程代码执行攻击。这两个漏洞的CVSS评分为9.3&#xff0c;表明它们的严重性很高&#…

C++:Opencv读取ONNX模型,通俗易懂

1. 准备 ONNX 模型 假设你已经有一个训练好的 ONNX 模型文件。可以从各类深度学习框架&#xff08;如 PyTorch、TensorFlow&#xff09;中导出 ONNX 模型。例如&#xff0c;下面是一个简单的 PyTorch 模型导出为 ONNX 文件的示例&#xff1a; import torch import torchvisio…

在使用React Hooks中,如何避免状态更新时的性能问题?

在React Hooks中避免状态更新时的性能问题&#xff0c;可以采取以下一些最佳实践&#xff1a; 避免不必要的状态更新&#xff1a; 使用React.memo、useMemo、和useCallback来避免组件或其子组件进行不必要的渲染。 使用useMemo&#xff1a; 对于基于状态或props的复杂计算&…

MES管理系统助力印刷企业实现智能化工艺流程

在印刷这一古老而充满活力的行业中&#xff0c;科技的浪潮正以前所未有的速度重塑着每一个生产环节。随着制造业数字化转型的深入&#xff0c;引入MES管理系统&#xff0c;为印刷企业带来了从原材料入库到成品出库的全流程智能化变革&#xff0c;不仅提升了生产效率&#xff0c…

剪辑小白必看:好用的剪辑工具推荐!

作为一位热爱创作的视频制作者&#xff0c;我尝试过不少剪辑软件&#xff0c;今天我想分享自己对福昕视频剪辑、爱拍剪辑、达芬奇和VSDC Video Editor这四款软件的使用体验。 福昕视频剪辑 链接&#xff1a;www.pdf365.cn/foxit-clip/ 我第一次接触到福昕视频剪辑是在朋友的…

python基础语法2

python基础语法2 了解整体内容可以从基础语法1开始&#xff0c;第2天了&#xff0c;开始上代码片段。 本篇主要内容&#xff1a;控制流语句if、for、match等。 打印及main方法 # 注释使用#号 #打印hello def print_hello(name):#这里加上f是打印变量内容&#xff0c;不加f打印…

树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例

树数据结构&#xff08;Tree Data Structures&#xff09;的全面指南&#xff1a;深度解析、算法实战与应用案例 引言 树数据结构&#xff08;Tree Data Structures&#xff09;作为计算机科学中的基石之一&#xff0c;以其独特的层次结构和分支特性&#xff0c;在众多领域发…

2012-2022年各省新质生产力匹配数字经济数据

2012-2022年各省新质生产力匹配数字经济数据 1、时间&#xff1a;2012-2022年 2、来源&#xff1a;各省年鉴、能源年鉴、工业年鉴、统计年鉴 3、指标&#xff1a;prov、year、gdp亿元、在岗职工工资元、第三产业就业比重、人均受教育平均年限、教育经费强度、在校学生结构、…

【STM32】IWDG独立看门狗与WWDG窗口看门狗

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 WDG简介 IWDG IWDG特性 独立看门狗时钟 键寄存器 超时时间 IWDG代码 WWDG WWDG特性 窗口看门狗时钟 超时时间 WWDG时序 WWDG代码 IWDG和WWDG对比 WDG简介 WDG&#xff08;…

面经:什么是Transformer位置编码?

过去的几年里&#xff0c;Transformer大放异彩&#xff0c;在各个领域疯狂上分。它究竟是做什么&#xff0c;面试常考的Transformer位置编码暗藏什么玄机&#xff1f;本文一次性讲解清楚。 Transformer的结构如下&#xff1a; 可能是NLP界出镜率最高的图 Transformer结构中&a…

最大公约数(欧几里得算法)

欧几里得算法 只需要记住一个公式&#xff08;不需要推导&#xff0c;这就是数论的基础知识&#xff09;&#xff1a; step1&#xff1a; 判断小括号内右边的数字 b 是否为0&#xff0c;如果为0&#xff0c;输出小括号左边的数字 a &#xff0c;就是一开始要求的两个数的最大…

深度学习入门笔记

深度学习入门笔记 感知机逻辑与门与非门或门多层感知机异或门 神经网络激活函数输出层设计损失函数均方误差 MSE交叉熵误差 反向传播算法计算图局部计算计算图反向传播反向传播 参数更新训练过程总结 该篇文章为本人学习笔记的一部分。笔记基于《深度学习入门 基于python理论实…

49-结构化程序设计方法的理解

‌结构化程序设计方法‌是一种以提高程序可读性、易维护性、可调性和可扩充性为目标的程序设计方法。它基于模块化设计原则&#xff0c;将程序划分为多个功能模块&#xff0c;每个模块负责实现特定的功能。这种方法强调使用三种基本控制结构&#xff1a;顺序、选择和循环&#…

在Linux下搭建go环境

下载go go官网&#xff1a;All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上&#xff0c;也可以直接web下载&#xff1a; wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压&#xff1a; tar -x…

关于前端布局的基础知识

float 横向布局 float 实现横向布局&#xff0c;需要向横着布局的元素添加float 其值left right 存在问题 如果使用float 所在父级五高度&#xff0c;会导致下方的元素上移 top的高度被吞了 解决方法&#xff1a; 给父级元素设置高度&#xff1a;不推荐&#xff0c;需要给父级…

专题◉万字长文!盘点过去一年最出圈的Prompt项目教程,有3份在悄悄更新

1. OpenAI 官方出品 | 提示工程最权威的教程 (最新版) 2023年6月&#xff0c;OpenAI 发布了一篇〖*GPT Best Practice (GPT 最佳实践)* 〗教程&#xff0c;详细介绍 ChatGPT Prompt 交互策略&技巧&#xff0c;并且给出了示例说明。 一年时间过去了&#xff0c;OpenAI 不…

Axure RP实战:打造高效文字点选验证码

Axure RP实战&#xff1a;打造高效文字点选验证码 前言 在数字时代&#xff0c;网络安全和用户体验是设计在线表单时的两大关键考量。 验证码作为一种验证用户身份的技术&#xff0c;已经从简单的数字和字母组合&#xff0c;发展到了更为复杂和用户友好的形式。 今天&#…

数量关系:成本售价利润问题

问&#xff1a;某品牌服装&#xff0c;甲店进货价比乙店便宜10%&#xff0c;两店同时按20%的利润定价&#xff0c;这样1件商品乙店比甲店多赚4元&#xff0c;乙店的定价是多少元?() A 200 B 216 C 240【正确答案】 D 300标准答案&#xff1a;设乙店的进货价为x,则甲店的为0.9x…

灵办AI:解锁办公新境界,让工作更智能、更高效!

在这个信息爆炸的时代&#xff0c;我们每个人都在寻找能够提升效率、简化工作流程的工具。如果您正在寻找一个能够全方位提升工作效率的AI助手&#xff0c;那么灵办AI绝对值得您的关注。 为什么选择灵办AI&#xff1f; 在众多AI工具中&#xff0c;灵办AI凭借其卓越的性能和独…