waitpid使用

news2025/1/30 23:09:10

waitpid 是 Unix/Linux 系统中用于等待子进程状态变化的系统调用。它允许父进程挂起执行,直到指定的子进程终止或者发生了其他指定的状态变化。

waitpid 的语法

pid_t waitpid(pid_t pid, int *status, int options);
  • pid: 要等待的子进程的进程 ID,特殊值如下:

    • pid > 0: 等待进程 ID 为 pid 的特定子进程。
    • pid == 0: 等待任何属于与调用进程相同进程组的子进程。
    • pid < -1: 等待进程组 ID 等于 |pid| 的任何子进程。
    • pid == -1: 等待任何子进程,即等效于 wait()
  • status: 指向一个 int 变量的指针,用于保存子进程的终止状态。

  • options: 可以是 0 或者下列标志的组合:

    • WNOHANG: 如果没有子进程退出或状态变化,则立即返回,而不阻塞。
    • WUNTRACED: 当一个子进程停止(例如被 SIGSTOP 信号停止)时返回其状态,而不是等到子进程终止。
    • WCONTINUED: 如果子进程在接收到 SIGCONT 信号后继续运行,并且其状态尚未报告,则返回其状态。

waitpid 的返回值

  • 成功时,返回等待的子进程的 PID。
  • 如果设置了 WNOHANG 且没有立即可用的子进程终止状态,则返回 0
  • 失败时,返回 -1,并设置 errno 以指示错误。

status 变量解释

status 变量是一个整数,包含子进程的状态信息。可以使用一系列宏来解析这个状态值:

  • WIFEXITED(status):如果子进程正常终止,则返回非零值。
  • WEXITSTATUS(status):如果子进程正常终止,返回子进程的退出状态码。
  • WIFSIGNALED(status):如果子进程因信号终止,则返回非零值。
  • WTERMSIG(status):如果子进程因信号终止,返回导致终止的信号编号。
  • WIFSTOPPED(status):如果子进程处于停止状态,则返回非零值。
  • WSTOPSIG(status):如果子进程处于停止状态,返回导致停止的信号编号。
  • WIFCONTINUED(status):如果子进程已继续执行,则返回非零值(使用 WCONTINUED 标志时)。

示例代码

以下是一个使用 waitpid 等待子进程终止的示例代码:

#include <iostream>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        // 子进程代码
        std::cout << "Child process running, PID: " << getpid() << std::endl;
        sleep(2);  // 模拟一些工作
        std::cout << "Child process terminating" << std::endl;
        return 42;  // 子进程的退出状态码
    } else if (pid > 0) {
        // 父进程代码
        int status;
        pid_t result = waitpid(pid, &status, 0);  // 等待子进程终止

        if (result == -1) {
            std::cerr << "waitpid failed" << std::endl;
        } else {
            std::cout << "Child process " << result << " terminated" << std::endl;

            if (WIFEXITED(status)) {
                std::cout << "Child exited with status: " << WEXITSTATUS(status) << std::endl;
            } else if (WIFSIGNALED(status)) {
                std::cout << "Child killed by signal: " << WTERMSIG(status) << std::endl;
            } else if (WIFSTOPPED(status)) {
                std::cout << "Child stopped by signal: " << WSTOPSIG(status) << std::endl;
            } else if (WIFCONTINUED(status)) {
                std::cout << "Child continued" << std::endl;
            }
        }
    } else {
        std::cerr << "fork failed" << std::endl;
    }

    return 0;
}

代码解释

  • fork(): 创建一个子进程。pid 为 0 表示子进程,在子进程中执行特定代码。pid 为正表示父进程,父进程等待子进程结束。
  • waitpid(pid, &status, 0): 父进程调用 waitpid 等待子进程终止,并获取其退出状态。
  • WIFEXITED(status): 检查子进程是否正常退出。如果是,WEXITSTATUS(status) 将返回子进程的退出状态码。
  • WIFSIGNALED(status): 检查子进程是否被信号终止。如果是,WTERMSIG(status) 将返回导致子进程终止的信号编号。

waitpid 的常见应用

  1. 管理多个子进程waitpid 可以与 WNOHANG 选项一起使用,用于轮询多个子进程的状态,适合管理并发运行的子进程。
  2. 处理特定子进程:通过传递特定的 PID,waitpid 可以用于等待和管理某个特定子进程的状态变化。
  3. 防止僵尸进程:父进程使用 waitpid 回收子进程的退出状态,可以防止僵尸进程的产生。

总结

waitpid 是一个强大的系统调用,允许父进程灵活地等待和处理子进程的状态变化。通过正确使用 waitpid,可以有效地管理并发进程,处理子进程的终止状态,防止僵尸进程。

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

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

相关文章

对顾客行为的数据分析:融入2+1链动模式、AI智能名片与S2B2C商城小程序的新视角

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;企业与顾客之间的交互方式变得日益多样化&#xff0c;移动设备、社交媒体、门店、电子商务网站等交互点应运而生。这些交互点不仅为顾客提供了便捷的服务体验&#xff0c;同时也为企业积累了大量的顾客行为数据。本文旨在…

MySQL查询优化(三):深度解读 MySQL客户端和服务端协议

如果需要从 MySQL 服务端获得很高的性能&#xff0c;最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些&#xff0c;大部分的查询优化是有据可循的&#xff0c;从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程&#xff1a; 客户端…

UE AController

定义和功能 AController是一种特定于游戏的控制器&#xff0c;在UE框架中用于定义玩家和AI的控制逻辑。AController负责处理玩家输入&#xff0c;并根据这些输入驱动游戏中的角色或其他实体的行为。设计理念 AController设计用于分离控制逻辑与游戏角色&#xff0c;增强游戏设计…

Git进阶之旅:Git 配置信息 Config

Git 配置级别&#xff1a; 仓库级别&#xff1a;local [ 优先级最高 ]用户级别&#xff1a;global [ 优先级次之 ]系统级别&#xff1a;system [ 优先级最低 ] 配置文件位置&#xff1a; git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…

51单片机开发:定时器中断

目标&#xff1a;利用定时器中断&#xff0c;每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示&#xff0c;要使用定时器中断T0&#xff0c;须开启TE0、ET0。&#xff1a; 系统中断号如下图所示&#xff1a;定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…

深度学习框架应用开发:基于 TensorFlow 的函数求导分析

深度学习框架应用开发&#xff1a;基于 TensorFlow 的函数求导分析 在深度学习的世界里&#xff0c;梯度计算是优化算法的核心。而 TensorFlow 作为一款强大的深度学习框架&#xff0c;为我们提供了简洁而强大的工具来进行自动求导操作&#xff0c;这极大地简化了深度学习模型的…

2025春晚刘谦魔术揭秘魔术过程

2025春晚刘谦魔术揭秘魔术过程 首先来看全过程 将杯子&#xff0c;筷子&#xff0c;勺子以任意顺序摆成一排 1.筷子和左边物体交换位置 2.杯子和右边物体交换位置 3.勺子和左边物体交换位置 最终魔术的结果是右手出现了杯子 这个就是一个简单的分类讨论的问题。 今年的魔术…

上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一&#xff0e;市场情绪 市场全天冲高回落&#xff0c;深成指、创业板指午后翻绿。大金融板块全天强势&#xff0c;天茂集团…

01学习预热篇(D6_正式踏入JVM深入学习前的铺垫)

目录 学习前言 一、虚拟机的结构 1. Java虚拟机参数设置 2. java 堆 3. 出入栈 4. 局部变量表 1> 局部变量的剖析 2> 局部变量的回收 5. 操作数栈 1> 常量入栈指令 2> 局部变量值转载到栈中指令 3> 将栈顶值保存到局部变量中指令 6. 帧数据区 7. 栈…

【漫话机器学习系列】068.网格搜索(GridSearch)

网格搜索&#xff08;Grid Search&#xff09; 网格搜索&#xff08;Grid Search&#xff09;是一种用于优化机器学习模型超参数的技术。它通过系统地遍历给定的参数组合&#xff0c;找出使模型性能达到最优的参数配置。 网格搜索的核心思想 定义参数网格 创建一个包含超参数值…

https数字签名手动验签

以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构&#xff0c;由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体&#xff08;如子 CA 或终端实体&#xff09;颁发证书。层级结构的顶端是 根 CA&#xff08;Root CA&#xff09;&#xff0c;它是整个 PKI 体…

Elasticsearch+kibana安装(简单易上手)

下载ES( Download Elasticsearch | Elastic ) 将ES安装包解压缩 解压后目录如下: 修改ES服务端口&#xff08;可以不修改&#xff09; 启动ES 记住这些内容 验证ES是否启动成功 下载kibana( Download Kibana Free | Get Started Now | Elastic ) 解压后的kibana目…

视频多模态模型——视频版ViT

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》&#xff0c;2021由google 提出用于视频处理的视觉 Transformer 模型&#xff0c;在视频多模态领域有…

单机伪分布Hadoop详细配置

目录 1. 引言2. 配置单机Hadoop2.1 下载并解压JDK1.8、Hadoop3.3.62.2 配置环境变量2.3 验证JDK、Hadoop配置 3. 伪分布Hadoop3.1 配置ssh免密码登录3.2 配置伪分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …

Ollama windows安装

Ollama 是一个开源项目&#xff0c;专注于帮助用户本地化运行大型语言模型&#xff08;LLMs&#xff09;。它提供了一个简单易用的框架&#xff0c;让开发者和个人用户能够在自己的设备上部署和运行 LLMs&#xff0c;而无需依赖云服务或外部 API。这对于需要数据隐私、离线使用…

Van-Nav:新年,将自己学习的项目地址统一整理搭建自己的私人导航站,供自己后续查阅使用,做技术的同学应该都有一个自己网站的梦想

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Van-Nav是一个基于Vue.js开发的导航组件库&#xff0c;它提供了多种预设的样式和灵活的配置选项&#xff0c;使得开发者可以轻松地定制出符合项目需求…

网易云音乐歌名可视化:词云生成与GitHub-Pages部署实践

引言 本文将基于前一篇爬取的网易云音乐数据, 利用Python的wordcloud、matplotlib等库, 对歌名数据进行深入的词云可视化分析. 我们将探索不同random_state对词云布局的影响, 并详细介绍如何将生成的词云图部署到GitHub Pages, 实现数据可视化的在线展示. 介绍了如何从原始数据…

渲染流程概述

渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 &#xff08;给物体一个包围盒&#xff0c;利用包围盒和摄像机的视椎体进行碰撞检测&#xf…

libOnvif通过组播不能发现相机

使用libOnvif库OnvifDiscoveryClient类&#xff0c; auto discovery new OnvifDiscoveryClient(QUrl(“soap.udp://239.255.255.250:3702”), cb.Build()); 会有错误&#xff1a; end of file or no input: message transfer interrupted or timed out(30 sec max recv delay)…

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意&#xff1a;GateWay不能跟Web一起引入&#xff01; 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…