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 的常见应用
- 管理多个子进程:
waitpid可以与WNOHANG选项一起使用,用于轮询多个子进程的状态,适合管理并发运行的子进程。 - 处理特定子进程:通过传递特定的 PID,
waitpid可以用于等待和管理某个特定子进程的状态变化。 - 防止僵尸进程:父进程使用
waitpid回收子进程的退出状态,可以防止僵尸进程的产生。
总结
waitpid 是一个强大的系统调用,允许父进程灵活地等待和处理子进程的状态变化。通过正确使用 waitpid,可以有效地管理并发进程,处理子进程的终止状态,防止僵尸进程。
相关文章:
waitpid使用
waitpid 是 Unix/Linux 系统中用于等待子进程状态变化的系统调用。它允许父进程挂起执行,直到指定的子进程终止或者发生了其他指定的状态变化。 waitpid 的语法 pid_t waitpid(pid_t pid, int *status, int options); pid: 要等待的子进程的进程 ID,特殊…...
对顾客行为的数据分析:融入2+1链动模式、AI智能名片与S2B2C商城小程序的新视角
摘要:随着互联网技术的飞速发展,企业与顾客之间的交互方式变得日益多样化,移动设备、社交媒体、门店、电子商务网站等交互点应运而生。这些交互点不仅为顾客提供了便捷的服务体验,同时也为企业积累了大量的顾客行为数据。本文旨在…...
MySQL查询优化(三):深度解读 MySQL客户端和服务端协议
如果需要从 MySQL 服务端获得很高的性能,最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些,大部分的查询优化是有据可循的,从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程: 客户端…...
pytorch线性回归模型预测房价例子
import torch import torch.nn as nn import torch.optim as optim import numpy as np# 1. 创建线性回归模型类 class LinearRegressionModel(nn.Module):def __init__(self):super(LinearRegressionModel, self).__init__()self.linear nn.Linear(1, 1) # 1个输入特征&…...
UE AController
定义和功能 AController是一种特定于游戏的控制器,在UE框架中用于定义玩家和AI的控制逻辑。AController负责处理玩家输入,并根据这些输入驱动游戏中的角色或其他实体的行为。设计理念 AController设计用于分离控制逻辑与游戏角色,增强游戏设计…...
选择的阶段性质疑
条条大路通罗马,每个人选择的道路,方向并不一样,但不妨碍都可以到达终点,而往往大家会更推崇自己走过的路径。 自己靠什么走向成功,自己用了什么方法,奉行什么原则或者理念,也会尽可能传播这种&…...
Git进阶之旅:Git 配置信息 Config
Git 配置级别: 仓库级别:local [ 优先级最高 ]用户级别:global [ 优先级次之 ]系统级别:system [ 优先级最低 ] 配置文件位置: git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…...
51单片机开发:定时器中断
目标:利用定时器中断,每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示,要使用定时器中断T0,须开启TE0、ET0。: 系统中断号如下图所示:定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…...
ultralytics 是什么?
ultralytics 是一个用于计算机视觉任务的 Python 库,专注于提供高效、易用的目标检测、实例分割和图像分类工具。它最著名的功能是实现 YOLO(You Only Look Once) 系列模型,特别是最新的 YOLOv8。 1. YOLO 是什么? YO…...
Qt调用FFmpeg库实时播放UDP组播视频流
基于以下参考链接,通过改进实现实时播放UDP组播视频流 https://blog.csdn.net/u012532263/article/details/102736700 源码在windows(qt-opensource-windows-x86-5.12.9.exe)、ubuntu20.04.6(x64)(qt-opensource-linux-x64-5.12.12.run)、以…...
Python学习之旅:进阶阶段(五)数据结构-双端队列(collections.deque)
在 Python 的进阶学习过程中,数据结构的掌握至关重要。今天要介绍的双端队列(deque,即 double-ended queue),是一种非常实用的数据结构,Python 的collections模块中的deque类为我们提供了强大的双端队列操作功能。接下来,就一起深入了解双端队列吧。 一、什么是双端队列…...
selenium自动化测试框架——面试题整理
目录 1. 什么是 Selenium?它的工作原理是什么? 2. Selenium 主要组件 3. 常见 WebDriver 驱动 4. Selenium 如何驱动浏览器? 5. WebDriver 协议是什么? 6. Page Object 模式与 Page Factory 7. 如何判断元素是否可见&#x…...
第19篇:python高级编程进阶:使用Flask进行Web开发
第19篇:python高级编程进阶:使用Flask进行Web开发 内容简介 在第18篇文章中,我们介绍了Web开发的基础知识,并使用Flask框架构建了一个简单的Web应用。本篇文章将深入探讨Flask的高级功能,涵盖模板引擎(Ji…...
深度学习框架应用开发:基于 TensorFlow 的函数求导分析
深度学习框架应用开发:基于 TensorFlow 的函数求导分析 在深度学习的世界里,梯度计算是优化算法的核心。而 TensorFlow 作为一款强大的深度学习框架,为我们提供了简洁而强大的工具来进行自动求导操作,这极大地简化了深度学习模型的…...
【学术会议征稿-第二届生成式人工智能与信息安全学术会议(GAIIS 2025)】人工智能与信息安全的魅力
重要信息 时间:2025年2月21日-23日 地点:中国杭州 官网:http://www.ic-gaiis.org 简介 2025年第二届生成式人工智能与信息安全将于 2025年2月21日-23日在中国杭州举行。主要围绕“生成式人工智能与信息安全”的最新研究展开,…...
2025春晚刘谦魔术揭秘魔术过程
2025春晚刘谦魔术揭秘魔术过程 首先来看全过程 将杯子,筷子,勺子以任意顺序摆成一排 1.筷子和左边物体交换位置 2.杯子和右边物体交换位置 3.勺子和左边物体交换位置 最终魔术的结果是右手出现了杯子 这个就是一个简单的分类讨论的问题。 今年的魔术…...
postgresql的用户、数据库和表
在 PostgreSQL 中,用户、数据库和表是关系型数据库系统的基本组成部分。理解这些概念对数据库管理和操作至关重要。下面是对这些概念的详细解释: 1. 用户(User) 在 PostgreSQL 中,用户(也称为 角色&#…...
上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天冲高回落,深成指、创业板指午后翻绿。大金融板块全天强势,天茂集团…...
06-机器学习-数据预处理
数据清洗 数据清洗是数据预处理的核心步骤,旨在修正或移除数据集中的错误、不完整、重复或不一致的部分,为后续分析和建模提供可靠基础。以下是数据清洗的详细流程、方法和实战示例: 一、数据清洗的核心任务 问题类型表现示例影响缺失值数值…...
01学习预热篇(D6_正式踏入JVM深入学习前的铺垫)
目录 学习前言 一、虚拟机的结构 1. Java虚拟机参数设置 2. java 堆 3. 出入栈 4. 局部变量表 1> 局部变量的剖析 2> 局部变量的回收 5. 操作数栈 1> 常量入栈指令 2> 局部变量值转载到栈中指令 3> 将栈顶值保存到局部变量中指令 6. 帧数据区 7. 栈…...
【漫话机器学习系列】068.网格搜索(GridSearch)
网格搜索(Grid Search) 网格搜索(Grid Search)是一种用于优化机器学习模型超参数的技术。它通过系统地遍历给定的参数组合,找出使模型性能达到最优的参数配置。 网格搜索的核心思想 定义参数网格 创建一个包含超参数值…...
https数字签名手动验签
以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构,由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体(如子 CA 或终端实体)颁发证书。层级结构的顶端是 根 CA(Root CA),它是整个 PKI 体…...
【股票数据API接口36】如何获取股票当天逐笔大单交易数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
如今,量化分析在股市领域风靡一时,其核心要素在于数据,获取股票数据,是踏上量化分析之路的第一步。你可以选择亲手编写爬虫来抓取,但更便捷的方式,莫过于利用专业的股票数据API接口。自编爬虫虽零成本&a…...
RocketMQ 中如何实现消息的可靠传递?
引言 作为头部消息队列开源中间件,学习其中的技术方案并且总结可靠性和健壮性,提升我们的架构思维和解决问题的能力 。 在 RocketMQ 中实现消息的可靠传递可以从多个方面入手,涵盖生产者、Broker 以及消费者等不同环节。 生产者端 1. 同步…...
Elasticsearch+kibana安装(简单易上手)
下载ES( Download Elasticsearch | Elastic ) 将ES安装包解压缩 解压后目录如下: 修改ES服务端口(可以不修改) 启动ES 记住这些内容 验证ES是否启动成功 下载kibana( Download Kibana Free | Get Started Now | Elastic ) 解压后的kibana目…...
视频多模态模型——视频版ViT
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》,2021由google 提出用于视频处理的视觉 Transformer 模型,在视频多模态领域有…...
单机伪分布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 是一个开源项目,专注于帮助用户本地化运行大型语言模型(LLMs)。它提供了一个简单易用的框架,让开发者和个人用户能够在自己的设备上部署和运行 LLMs,而无需依赖云服务或外部 API。这对于需要数据隐私、离线使用…...
鸿蒙next 自定义日历组件
效果图预览 20250124-113957 使用说明 1.选择日期左右箭头,实现每月日历切换,示例中超出当前月份,禁止进入下一月,可在代码更改 2.日历中显示当前选择的日期,选中的日期颜色可自定义 3.日历中可展示历史记录作为数据…...
Nginx 开发总结
文章目录 1. Nginx 基础概念1-1、什么是 Nginx1-2、Nginx 的工作原理1-3、Nginx 的核心特点1-4、Nginx 的常见应用场景1-5、Nginx 与 Apache 的区别1-6、 Nginx 配置的基本结构1-7、Nginx 常见指令 2. Nginx 配置基础2-1、Nginx 配置文件结构2-2、全局配置 (Global Block)2-3、…...
