wait的概念和使用方法

news2025/3/31 17:55:53

在C语言中,wait 函数主要用于进程管理,它是一个系统调用,定义在 <sys/wait.h> 头文件中,用于让父进程等待其子进程结束,并获取子进程的终止状态。下面为你详细介绍其概念和使用方法。

概念

wait 函数的原型如下:

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *wstatus);
  • 参数
    • wstatus:这是一个指向整数的指针,用于存储子进程的终止状态信息。如果不关心子进程的终止状态,可以将其设置为 NULL
  • 返回值
    • 若调用成功,wait 函数会返回终止子进程的进程ID(PID)。
    • 若调用失败,返回 -1,并设置 errno 来指示具体的错误类型。常见的错误情况包括没有子进程、调用被信号中断等。

使用方法

基本使用

以下示例展示了如何使用 wait 函数让父进程等待子进程结束:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid;
    int status;

    // 创建子进程
    pid = fork();

    if (pid < 0) {
        // 处理 fork 失败的情况
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子进程代码
        printf("子进程开始执行,进程ID: %d\n", getpid());
        sleep(2);  // 模拟子进程执行一些任务
        printf("子进程执行完毕\n");
        exit(EXIT_SUCCESS);
    } else {
        // 父进程代码
        printf("父进程等待子进程结束,子进程ID: %d\n", pid);
        // 调用 wait 函数等待子进程结束
        pid_t terminated_pid = wait(&status);
        if (terminated_pid == -1) {
            perror("wait");
            exit(EXIT_FAILURE);
        }
        printf("子进程 %d 已结束,退出状态: %d\n", terminated_pid, WEXITSTATUS(status));
    }

    return 0;
}

在这个例子中:

  1. 首先使用 fork 函数创建一个子进程。
  2. 子进程执行一些任务(这里通过 sleep 函数模拟),然后调用 exit 函数退出。
  3. 父进程调用 wait 函数等待子进程结束,并通过 WEXITSTATUS 宏来获取子进程的退出状态。
检查子进程的终止状态

wait 函数的 wstatus 参数可以用来获取子进程的终止状态信息,通过一些宏可以对这些信息进行解析:

  • WIFEXITED(status):若子进程正常退出(通过 exitreturn),该宏返回非零值。
  • WEXITSTATUS(status):当 WIFEXITED 为真时,该宏返回子进程的退出状态码。
  • WIFSIGNALED(status):若子进程因接收到信号而终止,该宏返回非零值。
  • WTERMSIG(status):当 WIFSIGNALED 为真时,该宏返回导致子进程终止的信号编号。

以下是一个示例,展示如何使用这些宏来检查子进程的终止状态:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid;
    int status;

    pid = fork();

    if (pid < 0) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子进程代码
        printf("子进程开始执行,进程ID: %d\n", getpid());
        sleep(2);
        printf("子进程执行完毕\n");
        exit(42);  // 设置退出状态码为 42
    } else {
        // 父进程代码
        printf("父进程等待子进程结束,子进程ID: %d\n", pid);
        pid_t terminated_pid = wait(&status);
        if (terminated_pid == -1) {
            perror("wait");
            exit(EXIT_FAILURE);
        }

        if (WIFEXITED(status)) {
            printf("子进程正常退出,退出状态码: %d\n", WEXITSTATUS(status));
        } else if (WIFSIGNALED(status)) {
            printf("子进程因信号 %d 终止\n", WTERMSIG(status));
        }
    }

    return 0;
}

注意事项

  • 阻塞特性wait 函数是阻塞的,意味着父进程会一直等待,直到有一个子进程结束。如果没有子进程,wait 函数会立即返回 -1。
  • 资源回收:使用 wait 函数可以避免产生僵尸进程。僵尸进程是指子进程已经结束,但父进程没有回收其资源的进程。通过调用 wait 函数,父进程可以获取子进程的终止状态,并释放其占用的系统资源。

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

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

相关文章

HarmonyOS NEXT——鸿蒙神策埋点(二)

在上一章我分享了鸿蒙客户端集成神策埋点sdk的过程&#xff0c;现在我们需要服务端的小伙伴配置集成服务端sdk接收处理数据信息&#xff0c;以下是集成的过程。 Java服务端sdk集成 1、获取神策数据平台url地址 1、导入集成&#xff1a; dependencies {compile com.sensorsda…

编程考古-Borland JBuilder:一场关于Java灵魂的战争与救赎

本文也是填之前一位网友让谈谈JBuilder的一个坑&#xff0c;感谢各位技术爱好者的支持。感谢关注小编&#xff0c;你的关注&#xff0c;是我更新的动力。 本篇章节如下&#xff1a; 序章&#xff1a;JBuilder的黄金时代 Borland的JBuilder&#xff1a;纯技术主义的胜利 生死…

【day4】数据结构刷题 树

6-1 二叉树的遍历 函数接口定义&#xff1a; void InorderTraversal( BinTree BT ); void PreorderTraversal( BinTree BT ); void PostorderTraversal( BinTree BT ); void LevelorderTraversal( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Po…

Elea AI:以人工智能之力推动病理实验室革新的技术突破与实践探索

Elea AI:以人工智能之力推动病理实验室革新的技术分析 一、病理实验室现状与 Elea AI 的革新契机 (一)传统病理实验室的痛点剖析 在医疗体系中,病理实验室扮演着至关重要的角色,其诊断结果是疾病确诊与后续治疗方案制定的关键依据。然而,当前传统病理实验室在实际运作过…

相似度计算 ccf-csp 2024-2-2

#include<bits/stdc.h> using namespace std;int main() {// 定义两个变量 n 和 m&#xff0c;分别用于存储两篇文章的单词个数int n, m;// 从标准输入读取 n 和 m 的值cin >> n >> m;// 定义三个 map 容器&#xff0c;A 用于存储并集&#xff0c;T 用于标记…

多省发布!第27届中国机器人及人工智能大赛各赛区比赛通知

01 大赛介绍 中国机器人及人工智能大赛是由中国人工智能学会主办的极具影响力的全国性学科竞赛&#xff0c;旨在推动我国机器人及人工智能技术的创新与应用&#xff0c;促进相关专业的人才培养。作为全国高校学科竞赛A类赛事&#xff0c;该比赛吸引了众多高校和科研机构的积极…

对锁进行封装

目录 锁的封装 makefile编写 测试运行 RAII式封装 我们今天学习对锁进行封装。 我们在命名空间里面&#xff0c;在自己构建的类mutex里面完成对锁的封装。 锁的封装 我们要进行动态初始化锁&#xff0c;首先要有一个锁对象&#xff0c;所以mutex类里面的私有成员就是锁对…

C++Primer学习(14.1 基本概念)

当运算符作用于类类型的运算对象时&#xff0c;可以通过运算符重载重新定义该运算符的含义。明智地使用运算符重载能令我们的程序更易于编写和阅读。举个例子&#xff0c;因为在Sales_item类中定义了输入、输出和加法运算符&#xff0c;所以可以通过下述形式输出两个Sales_item…

HTML跑酷

先看效果 再上代码 <!DOCTYPE html> <html> <head><title>火柴人跑酷</title><style>body {margin: 0;overflow: hidden;background: #87CEEB;}#gameCanvas {background: linear-gradient(to bottom, #87CEEB 0%, #87CEEB 50%, #228B22 …

ChemBioServer: 一个在线“药物发现/再利用”的平台

ChemBioServer 是一个提供高级化学化合物过滤、聚类和网络分析的服务器&#xff0c;旨在支持药物发现和药物再利用&#xff08;drug repurposing&#xff09;。它集成了多种工具和网络服务&#xff0c;以便更高效地筛选、分析和可视化化学化合物。 网站地址&#xff1a; https:…

数据结构(4)——带哨兵位循环双向链表

目录 前言 一、带哨兵的循环双向链表是什么 二、链表的实现 2.1规定结构体 2.2创建节点 2.3初始化 2.4打印 2.5检验是否为空 2.6销毁链表 2.7尾插 2.8尾删 2.9头插 2.10头删 2.11寻找特定节点 2.12任意位置插入&#xff08;pos前&#xff09; 2.13删除任意节点 …

【MyBatis】MyBatis 操作数据库(入门)

文章目录 前言一、什么是MyBatis&#xff1f;二、MyBatis入门2.1、准备工作2.1.1 创建工程2.1.2、数据准备 2.2、配置数据库连接字符串2.3、写持久层代码2.4 单元测试 三、MyBatis的基础操作3.1 打印日志3.2、参数传递3.3、增(Insert)3.4、 删(Delete)3.5、改(Update)3.6、查(S…

高速电路中的存储器应用与设计四

5 SRAM介绍及其应用要点 DRAM的性能在很大程度上受到刷新操作的影响&#xff0c;而SRAM则不涉及刷新&#xff0c;因此在相同时钟频率的条件下&#xff0c;SRAM的性能远高于DRAM。 SRAM的缺点是集成度低、容量小、功耗大、价格高。 在应用的场合上&#xff0c;SRAM毫不逊色于…

Vue2 项目将网页内容转换为图片并保存到本地

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

HT81697——30W内置升压单声道D类/AB类音频功放

1 特性 ● 防削顶失真功能(防破音,Anti-Clipping Function,ACF) ● 扩频技术 ● 输出功率 28W (VBAT7.2V, RL4Ω, THDN10%, PVDD 15.5V, fiN 1kHz) 22W (VBAT7.2V,RL4Ω, THDN1%, PVDD 15.5V, fin 1kHz) 16.5W (VBAT3.7V, RL4Ω, THDN10%, PVDD 12V, fiN 1kHz) 12.8W (VBAT…

关于ArcGIS中加载影像数据,符号系统中渲染参数的解析

今天遇到一个很有意思的问题&#xff0c;故记录下来&#xff0c;以作参考和后续的研究。欢迎随时沟通交流。如果表达错误或误导&#xff0c;请各位指正。 正文 当我们拿到一幅成果影像数据的时候&#xff0c;在不同的GIS软件中会有不同效果呈现&#xff0c;但这其实是影像是…

GAMMA数据处理(十)

今天向别人请教了一个问题&#xff0c;刚无意中搜索到了一模一样的问题 不知道这个怎么解决... ok 解决了 有一个GAMMA的命令可转换 但是很奇怪 完全对不上 转换出来的行列号 不知道为啥 再试试 是因为经纬度坐标的小数点位数 de as

基于改进粒子群算法的多目标分布式电源选址定容规划(附带Matlab代码)

通过分析分布式电源对配电网的影响&#xff0c;以有功功率损耗、电压质量及分布式电源总容量为优化目标&#xff0c;基于模糊理论建立了分布式电源在配电网中选址定容的多目标优化模型&#xff0c;并提出了一种改进粒子群算法进行求解。在算例仿真中&#xff0c;基于IEEE-14标准…

SAP 学习笔记 - 系统移行业务 - MALSY(由Excel 移行到SAP 的收费工具)

以前有关移行&#xff0c;也写过一些文章&#xff0c;比如 SAP 学习笔记 - 系统移行业务 - Migration cockpit工具 - 移行Material&#xff08;品目&#xff09;-CSDN博客 SAP 学习笔记 - 系统移行业务 - Migration cockpit工具2 - Lot导入_sap cockpit-CSDN博客 SAP学习笔记…

2025美国网络专线国内服务商推荐

在海外业务竞争加剧的背景下&#xff0c;稳定高效的美国网络专线已成为外贸企业、跨国电商及跨国企业的刚需。面对复杂的国际网络环境和严苛的业务要求&#xff0c;国内服务商Ogcloud凭借其创新的SD-WAN技术架构与全球化网络布局&#xff0c;正成为企业拓展北美市场的优选合作伙…