waitpid使用

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.mzph.cn/bicheng/69439.shtml

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

相关文章

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性&#xff0c;分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行…

记录 | Docker的windows版安装

目录 前言一、1.1 打开“启用或关闭Windows功能”1.2 安装“WSL”方式1&#xff1a;命令行下载方式2&#xff1a;离线包下载 二、Docker Desktop更新时间 前言 参考文章&#xff1a;Windows Subsystem for Linux——解决WSL更新速度慢的方案 参考视频&#xff1a;一个视频解决D…

stack 和 queue容器的介绍和使用

1.stack的介绍 1.1stack容器的介绍 stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了&#xff0c;还不了解的uu&#xff0c; 可以移步去看这篇博客哟&#xff1a; 数据结构-栈数据结构-队列 简单回顾一下&#xff0c;重要的概念其实就是后进先出&#xff0c;栈在…

JUC--ConcurrentHashMap底层原理

ConcurrentHashMap底层原理 ConcurrentHashMapJDK1.7底层结构线程安全底层具体实现 JDK1.8底层结构线程安全底层具体实现 总结JDK 1.7 和 JDK 1.8实现有什么不同&#xff1f;ConcurrentHashMap 中的 CAS 应用 ConcurrentHashMap ConcurrentHashMap 是一种线程安全的高效Map集合…

C++17 std::variant 详解:概念、用法和实现细节

文章目录 简介基本概念定义和使用std::variant与传统联合体union的区别 多类型值存储示例初始化修改判断variant中对应类型是否有值获取std::variant中的值获取当前使用的type在variant声明中的索引 访问std::variant中的值使用std::get使用std::get_if 错误处理和访问未初始化…

NLP自然语言处理通识

目录 ELMO 一、ELMo的核心设计理念 1. 静态词向量的局限性 2. 动态上下文嵌入的核心思想 3. 层次化特征提取 1. 双向语言模型&#xff08;BiLM&#xff09; 2. 多层LSTM的层次化表示 三、ELMo的运行过程 1. 预训练阶段 2. 下游任务微调 四、ELMo的突破与局限性 1. 技术突破 2. …

在做题中学习(82):最小覆盖子串

解法&#xff1a;同向双指针——>滑动窗口 思路&#xff1a;题目要求找到s里包含t所有字符的最小子串&#xff0c;这就需要记录在s中每次查找并扩大范围时所包含进去的字符种类是否和t的相同&#xff0c;并且&#xff1a;题目提示t中会有重复字符&#xff0c;因此不能简单认…

【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像

一、背景 由于国际镜像国内无法直接访问&#xff0c;会导致搜索模型时加载失败&#xff0c;如下&#xff1a; 因此需将国际地址替换为国内镜像地址。 二、操作 1、使用vscode打开下载路径 2、全局地址替换 关键字 huggingface.co 替换为 hf-mirror.com 注意&#xff1a;务…

DeepSeek:突破传统的AI算法与下载排行分析

DeepSeek的AI算法突破DeepSeek相较于OpenAI以及其它平台的性能对比DeepSeek的下载排行分析&#xff08;截止2025/1/28 AI人工智能相关DeepSeek甚至一度被推上了搜索&#xff09;未来发展趋势总结 在人工智能技术飞速发展的当下&#xff0c;搜索引擎市场也迎来了新的变革。DeepS…

java 判断Date是上午还是下午

我要用Java生成表格统计信息&#xff0c;如下图所示&#xff1a; 所以就诞生了本文的内容。 在 Java 里&#xff0c;判断 Date 对象代表的时间是上午还是下午有多种方式&#xff0c;下面为你详细介绍不同的实现方法。 方式一&#xff1a;使用 java.util.Calendar Calendar 类…

【Matlab高端绘图SCI绘图模板】第05期 绘制高阶折线图

1.折线图简介 折线图是一个由点和线组成的统计图表&#xff0c;常用来表示数值随连续时间间隔或有序类别的变化。在折线图中&#xff0c;x 轴通常用作连续时间间隔或有序类别&#xff08;比如阶段1&#xff0c;阶段2&#xff0c;阶段3&#xff09;。y 轴用于量化的数据&#x…

【Java数据结构】了解排序相关算法

基数排序 基数排序是桶排序的扩展&#xff0c;本质是将整数按位切割成不同的数字&#xff0c;然后按每个位数分别比较最后比一位较下来的顺序就是所有数的大小顺序。 先对数组中每个数的个位比大小排序然后按照队列先进先出的顺序分别拿出数据再将拿出的数据分别对十位百位千位…

Linux的常用指令的用法

目录 Linux下基本指令 whoami ls指令&#xff1a; 文件&#xff1a; touch clear pwd cd mkdir rmdir指令 && rm 指令 man指令 cp mv cat more less head tail 管道和重定向 1. 重定向&#xff08;Redirection&#xff09; 2. 管道&#xff08;Pipes&a…

Ubuntu20.04 磁盘空间扩展教程

Ubuntu20.04 磁盘空间扩展教程_ubuntu20 gpart扩容-CSDN博客文章浏览阅读2w次&#xff0c;点赞38次&#xff0c;收藏119次。执行命令查看系统容量相关的数据&#xff1a;df -h当前容量为20G&#xff0c;已用18G&#xff08;96%&#xff09;&#xff0c;可用844M&#xff0c;可用…

使用Maxscript定义纹理贴图的方法

在3ds Max中,MaxScript 是一种用于插件编写和自动化任务的强大工具。通过MaxScript,你可以创建和操作对象、材质、灯光等等。要为材质分配纹理贴图,你可以按照以下方法来编写脚本。直接代码: myBmp = bitmaptexture filename:"D:\map001.tga" meditmaterials[1]…

每日一题-判断是否是平衡二叉树

判断是否是平衡二叉树 题目描述数据范围题解解题思路递归算法代码实现代码解析时间和空间复杂度分析示例示例 1示例 2 总结 ) 题目描述 输入一棵节点数为 n 的二叉树&#xff0c;判断该二叉树是否是平衡二叉树。平衡二叉树定义为&#xff1a; 它是一棵空树。或者它的左右子树…

21款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09; ​ Python烟花② 完整…

2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)

2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.1.4问题1样例代码运行结果&…

day6手机摄影社区,可以去苹果摄影社区学习拍摄技巧

逛自己手机的社区&#xff1a;即&#xff08;手机牌子&#xff09;摄影社区 拍照时防止抖动可以控制自己的呼吸&#xff0c;不要大喘气 拍一张照片后&#xff0c;如何简单的用手机修图&#xff1f; HDR模式就是让高光部分和阴影部分更协调&#xff08;拍风紧时可以打开&…

【翻转硬币——莫比乌斯函数、分块、卷积、埃氏筛】

题目 暴力代码&#xff0c;官网过55% #include <bits/stdc.h> using namespace std; int main() {int n;cin >> n;vector<bool> a(n 1);a[1] 1;int res 1;for (int i 2; i < n; i){if (a[i] 0){for (int j i; j < n; j i)a[j] a[j] ^ 1;res;}…