【Linux】waitpid函数 及其 非阻塞等待和阻塞等待




在这里插入图片描述

        父进程等待子进程结束可以通过两种方式实现:阻塞等待和非阻塞等待。这两种方式各有优缺点,适用于不同的场景。



简单来说:

阻塞等待:先等你,我再继续

非阻塞等待:不等你,我继续做自己的事,期间不断看看你行没行



1. 函数 waitpid

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

参数说明

pid_ t :返回值

  • >0 : 子进程ID
  • =0 : 当选项 options 设置成 WNOHANG, 表示非阻塞等待, 若没有子进程退出,则返回 0
  • <0 : 该函数调用出错



pid:指定要等待的子进程的 PID(进程标识符)。

  • 如果 pid = -1 ,则等待任意一个子进程。
  • 如果 pid = 0 ,则等待当前进程所在进程组中的任意一个子进程。
  • 如果 pid > 0 ,为具体的子进程 PID,则等待指定的子进程。
  • 如果 pid > 0 ,但不是当前进程的子进程的 PID,则 waitpid() 会返回 -1 并设置 errnoECHILD


status:一个指向 int 类型的指针,用于接收子进程的状态信息。该参数是一个输出型参数,由操作系统填充

如果传递 NULL / nullptr,表示不关心子进程的退出状态信息。

  • 如果子进程正常退出,status 包含退出码。
  • 如果子进程异常退出:因信号而终止,status 包含信号编号。
  • 如果子进程异常退出:被停止或继续执行,status 包含相应的信号编号。


options:指定等待的选项,可以是以下标志之一或组合:

  • 0:默认等待,阻塞直到一个子进程结束。
  • WNOHANG非阻塞等待,如果没有任何子进程结束,则立即返回 0,不阻塞当前进程.若正常结束,则返回该子进程的 ID。
  • WUNTRACED:报告被跟踪的子进程(即使它们尚未停止)。
  • WCONTINUED:报告被继续执行的子进程(即被 SIGCONT 信号继续执行)


关于参数 status

参数 status 不能简单的当作整型来看待,可以当作位图来看待,具体细节如下图(只研究status低16比特位):
在这里插入图片描述
上面演示图表示两种进程终止,两种情况下参数 status 的两种数值表示

(1)当进程正常终止时:15~8 号为 进程退出码

(2)当进程异常终止(信号所杀):15~8 号 不用,7 号 core dump,6 ~ 0 为终止信号



进程退出码 和 进程异常终止的终止信号 可以通过对参数 status 进行 位运算获取

我们可以通过系统写好的宏来获取:底层是通过对 waitpid 函数参数 status 进行位运算,取对应部分的数值

详细如何使用相关系统宏,可以看这篇博客:如何通过系统宏定义,获取进程的退出码或退出信号



2. 阻塞等待(Blocking Wait)

阻塞等待意味着父进程会一直等待,直到子进程结束或出现错误为止。
通常使用 wait() 或带有默认选项的 waitpid() 函数实现(即 参数 options = 0):waitpid(pid, &status, 0);



3. 非阻塞等待(Non-blocking Wait)

非阻塞等待允许父进程在没有子进程结束的情况下继续执行其他任务。
通常使用带有 WNOHANG 选项的 waitpid() 函数实现(即 参数 options = WNOHANG):waitpid(pid, &status, WNOHANG);



4. 阻塞等待 vs 非阻塞等待


优点

  • 阻塞等待

    • 实现简单。
    • 确保父进程在子进程结束后继续执行。
  • 非阻塞等待

    • 父进程可以继续执行其他任务,提高程序效率。
    • 适用于需要同时处理多个子进程或其他任务的情况。

缺点

  • 阻塞等待

    • 父进程在此期间不能做其他事情,降低了程序的整体效率。
    • 如果子进程长时间不结束,父进程会一直处于等待状态。
  • 非阻塞等待

    • 实现相对复杂,需要循环检查子进程状态。
    • 如果频繁检查子进程状态,可能会增加不必要的CPU负载。


5. 应用场景选择

  • 阻塞等待

    • 适用于只需要等待一个子进程结束的简单场景。
    • 当父进程必须等待子进程结束后才能继续执行时。
  • 非阻塞等待

    • 适用于需要同时处理多个子进程或执行其他任务的复杂场景。
    • 当父进程在等待子进程的同时还需要处理其他事情时。

通过选择合适的等待方式,可以根据具体的应用需求和场景优化程序的设计和实现。

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

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

相关文章

使用Python实现某易云音乐歌曲下载

前言 在这篇文章中,我们将探讨如何通过Python结合JavaScript代码来逆向网易云音乐的API接口,以获取并下载指定歌曲。请注意,本文仅用于技术学习与交流目的,实际使用时请遵守相关法律法规及服务条款。 目标网站 1. 准备工作 首先,我们需要安装一些必要的库: execjs:用…

NVIDIA RTX 5080移动版GPU真身首曝!全系要用GDDR7

英伟达下一代移动版GPU的神秘面纱似乎正在揭开&#xff0c;Moore’s Law is Dead的最新视频首次曝光了疑似RTX 5080移动版GPU的工程样品照片。 这款工程样品印有N22W-ES-A1&#xff0c;与Clevo的下一代笔记本主板规格表相匹配&#xff0c;表明该芯片确实基于NVIDIA的下一代芯片…

java 提示 避免用Apache Beanutils进行属性的copy。

避免用Apache Beanutils进行属性的copy。 Inspection info: 避免用Apache Beanutils进行属性的copy。 说明&#xff1a;Apache BeanUtils性能较差&#xff0c;可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。 TestObject a new TestObject(); TestObject b new Te…

Cadence元件A属性和B属性相互覆盖

最近在使用第三方插件集成到Cadence,协助导出BOM到平台上&#xff0c;方便对BOM进行管理和修改&#xff0c;结果因为属性A和属性B不相同&#xff0c;导致导出的BOM错误。如下图&#xff1a; ​​ 本来我们需要导出Q12&#xff0c;结果给我们导出了Q13&#xff0c;或者反之&…

SpringBoot实现的高效民宿预订平台

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

AWD的复现

学习awd的相关资料&#xff1a;速成AWD并获奖的学习方法和思考记录- Track 知识社区 - 掌控安全在线教育 - Powered by 掌控者&#xff08;包含使用脚本去批量修改密码&#xff09; 在复现之前去了解了以下AWD的相关脚本 资料&#xff1a;AWD批量攻击脚本使用教程-CSDN博客 …

13_渲染器的设计

目录 渲染器与响应式系统的结合渲染器的基本概念自定义渲染器 渲染器与响应式系统的结合 渲染器与响应式系统是相辅相成的&#xff0c;渲染器负责将响应式系统中的响应式数据渲染到视图中&#xff0c;而响应式系统则负责监听数据的变化并通知渲染器进行更新。 渲染器在浏览器…

大数据-184 Elasticsearch - 原理剖析 - DocValues 机制原理 压缩与禁用

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

在 Docker 中搭建 PostgreSQL16 主从同步环境

1. 环境搭建 本文介绍了如何在同一台机器上使用 Docker 容器搭建 PostgreSQL 的主从同步环境。通过创建互联网络和配置主库及从库&#xff0c;详细讲解了数据库初始化、角色创建、数据同步和验证步骤。主要步骤包括设置主库的连接信息、创建用于复制的角色、使用 pg_basebacku…

成都跃享未来教育咨询有限公司抖音小店新生态

在数字化浪潮席卷全球的今天&#xff0c;教育行业正经历着前所未有的变革与升级。作为一座历史悠久而又充满活力的城市&#xff0c;成都凭借其深厚的文化底蕴和前瞻性的发展眼光&#xff0c;孕育了众多创新型企业。其中&#xff0c;成都跃享未来教育咨询有限公司&#xff08;以…

计算机专业大学四年的学习路线(非常详细),零基础入门到精通,看这一篇就够了

前言 许多学子选择踏上计算机这条充满挑战与机遇的道路。但在大学四年中&#xff0c;如何规划自己的学习路线&#xff0c;才能在毕业时脱颖而出&#xff0c;成为行业的佼佼者呢&#xff1f; 第一学年&#xff1a;基础知识的奠基 1.1 课程安排 在大学的第一年&#xff0c;重…

spark:Structured Streaming介绍

文章目录 1. Structured Streaming介绍1.1 实时计算和离线计算1.1.1 实时计算1.1.2 离线计算 1.2 有界和无界数据 2. 简单使用3. 编程模型4. 数据处理流程4.1 读取数据Source4.1.1 文件数据处理 4.2 计算操作 Operation4.3 数据输出 Sink4.3.1 输出模式4.3.2 指定输出位置4.3.3…

JVM篇(运行时数据区(实战课程学习总结)

目录 学习前言 一、运行时数据区 1. JVM运行时数据区规范 2. Hotspot运行时数据区 3. 分配JVM内存空间 分配堆的大小 分配方法区的大小 分配线程空间的大小 二、程序计数器 1. 作用 2. 存储的数据 3. 异常 三、Java虚拟机栈 1. 栈帧 1.1. 局部变量表 存储内容 …

【已解决】C# NPOI如何在Excel文本中增加下拉框

前言 上图&#xff01; 解决方法 直接上代码&#xff01;&#xff01;&#xff01;&#xff01;综合了各个大佬的自己修改了一下&#xff01;可以直接规定在任意单元格进行设置。 核心代码方法块 #region Excel增加下拉框/// <summary>/// 增加下拉框选项/// </s…

12. 命令行

Hyperf 的命令行默认由 hyperf/command 组件提供&#xff0c;而该组件本身也是基于 symfony/console 的抽象。 一、安装 通常来说该组件会默认存在&#xff0c;但如果您希望用于非 Hyperf 项目&#xff0c;也可通过下面的命令依赖 hyperf/command 组件。 composer require hype…

使用 Spring 框架构建 MVC 应用程序:初学者教程

Spring Framework 是一个功能强大、功能丰富且设计精良的 Java 平台框架。它提供了一系列编程和配置模型&#xff0c;旨在简化和精简 Java 中健壮且可测试的应用程序的开发过程。 人们常说 Java 太复杂了&#xff0c;构建简单的应用程序需要很长时间。尽管如此&#xff0c;Jav…

Unity/C#使用EPPlus读取和写入Excel

简介&#xff1a;本篇使用EPPlus来将数据写入Excel&#xff0c;如果需要使用NPOI那可以阅读我之前文档使用NPOI创建及写入数据_npoi 模板 写数据-CSDN博客 一、安装EPPlus 这里使用 .unitypackage 文件形式安装 1.1下载NuGetForUnity.unitypackage github进行搜索下载 下载…

vscode设置特定扩展名文件的打开编码格式

用vscode 编辑c语言或者Verilog代码, 由于其它开发工具的文件编码格式无法修改,默认只能是gb2312, 与我们国内奉行的统一 utf8 不一致. 所以只能是更改特殊文件的打开方式. 配置方式如下. 关键配置如下: {"git.openRepositoryInParentFolders": "never",…

【办公类-57-01】美工室材料报销EXCEL表批量插入截图(图片)

背景需求&#xff1a; 我们班分到美工室&#xff0c;需要准备大量材料&#xff0c;根据原始的报销单EXCLE&#xff0c;里面有商品名称、图片、链接、单位、数量等信息 今天我和搭档一起填写新表&#xff0c;发现手机截图的图片插入EXCEL后非常大&#xff0c; 需要手动调整图片…

4 -《本地部署开源大模型》在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型

在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型 大模型部署整体来看并不复杂&#xff0c;且官方一般都会提供标准的模型部署流程&#xff0c;但很多人在部署过程中会遇到各种各样的问题&#xff0c;很难成功部署&#xff0c;主要是因为这个过程会涉及非常多依赖库的安装和更新及…