进程等待waitwaitpid

文章目录

  • 进程等待
    • 进程等待的必要性
    • 进程等待的方法
      • wait
      • waitpid
      • status
    • 非阻塞等待

进程等待

任何子进程,在退出的情况下,一般必须要被父进程等待

进程等待的必要性

1.父进程通过等待,解决子进程退出的僵尸问题,回收系统资源。
2.获取子进程的退出信息,知道子进程是为什么退出的。

进程等待的方法

wait

pid_t wait(int*status);

如果子进程没有退出,父进程则一直进行堵塞等待
等待成功时,返回子进程的pid。
子进程本身是软件,父进程本质是等待某种软件条件就绪。
阻塞等待:将父进程设为S状态(非运行状态),把父进程的PCB链入子进的度队列中。

waitpid

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

返回值:
当正常返回的时候waitpid返回收集到的子进程的进程ID;
如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

pid:
Pid=-1,等待任一个子进程。与wait等效。
Pid>0.等待其进程ID与pid相等的子进程。
status:
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
options:
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。
如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。 如果不存在该子进程,则立即出错返回。

waitpid使用:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>void child() {int cnt = 5;while (cnt) {printf("i am child pid=%d ppid=%d cnt=%d\n", getpid(), getppid(), cnt);sleep(1);cnt--;}
}int main() {pid_t pid;int status;// 创建子进程pid = fork();if (pid < 0) {// 创建子进程失败perror("fork error\n");} else if (pid == 0) {child();} else {// 父进程代码// 等待子进程结束if (waitpid(pid, &status, 0) == -1) {perror("waitpid");exit(EXIT_FAILURE);}// 分析子进程的退出状态if (WIFEXITED(status)) {printf("Child exited normally with status %d\n",WEXITSTATUS(statu s));} else {printf("child exited abnormal\n");}// 标志位if (WCOREDUMP(status)) {printf("Child produced a core dump\n");} else {printf("Child did not produce a core dump\n");}}return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

status

wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。
若传NULL,表示不关心子进程的退出状态。
否则,根据该参数将子进程退出信息反馈给父进程。
在这里插入图片描述

非阻塞等待

将waitpid的option参数设置为WNOHANG。
pid_t>0:等待成功了,子进程退出,父进程成功回收子进程退出信息。
pid_t<0,等待失败了。
pid_t==0,子进程还没有退出,需进行下一轮等待。

非阻塞等待+循环=非阻塞轮询
非阻塞轮询运行父进程在等待过程中做其他事

测试一下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>void child() {int cnt = 5;while (cnt) {printf("i am child pid=%d ppid=%d cnt=%d\n", getpid(), getppid(), cnt);sleep(1);cnt--;}
}int main() {pid_t pid;int status;// 创建子进程pid = fork();if (pid < 0) {// 创建子进程失败perror("fork error\n");} else if (pid == 0) {child();}while (1) {pid_t rid = waitpid(pid, &status, WNOHANG);if (rid == 0) {usleep(10000);printf("child is running,father check next time!\n");printf("doing other thing\n");} else if (rid > 0) {if (WIFEXITED(status)) {printf("child quit success,child exit code:%d\n",WEXITSTATUS(status));} else {printf("child quit abnormal\n");}break;}}return 0;
}

在这里插入图片描述
实际运用中将doing other things换成其他程序或函数即可。

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

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

相关文章

深入浅出 -- 系统架构之日均亿级吞吐量的网关架构(DNS轮询解析)

在前篇关于《Nginx》的文章中曾经提到&#xff1a;单节点的Nginx在经过调优后&#xff0c;可承载5W左右的并发量&#xff0c;同时为确保Nginx的高可用&#xff0c;在文中也结合了Keepalived对其实现了程序宕机重启、主机下线从机顶替等功能。 但就算实现了高可用的Nginx依旧存在…

ccf201509-3模板生成系统(list,map,字符串综合运用)

问题描述 成成最近在搭建一个网站&#xff0c;其中一些页面的部分内容来自数据库中不同的数据记录&#xff0c;但是页面的基本结构是相同的。例如&#xff0c;对于展示用户信息的页面&#xff0c;当用户为 Tom 时&#xff0c;网页的源代码是&#xff1a; 而当用户为 Jerry 时…

Ubuntu 安装Java、Git、maven、Jenkins等持续集成环境

Ubuntu 持续集成 安装OpenJdk 查看所有可安装的 JDK 版本 apt list OpenJDK\*使用 apt 安装 JDK&#xff08;以 11为例&#xff09;,最好是用11&#xff0c;java8对应的jenkins会有兼容问题。 sudo apt install openjdk-11-jdk openjdk-11-jre安装成功后&#xff0c;可以使用以…

2011年认证杯SPSSPRO杯数学建模A题(第二阶段)客机水面迫降时的姿态全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 A题 客机水面迫降时的姿态 原题再现&#xff1a; 2009 年 1 月 15 日下午&#xff08;美国东部时间&#xff09;&#xff0c;US Airways 所属第 1549 航班&#xff08;空中客车 A320 客机&#xff09;在起飞后不久在纽约哈德逊河紧急迫降。经及…

《战神4》和《战神5》有什么联系吗 苹果电脑如何运行《战神4》苹果电脑玩战神 Mac玩游戏 战神5攻略 crossover激活码

《战神4》&#xff08;God of War 2018&#xff09;和《战神5》&#xff08;God of War: Ragnark&#xff09;是一对引人注目的游戏作品&#xff0c;它们不仅在游戏界引起了广泛的关注&#xff0c;也给玩家带来了深入探索北欧神话世界的机会。这两部游戏之间的联系不仅体现在剧…

UE5 在骨骼动画模型上绘制贴图

参考&#xff1a;Unreal 5.1 - How to paint damage textures and other effects on skeletal meshes 针对模型&#xff0c;在运行状态下通过射线指定一定范围&#xff0c;添加材质效果。 核心思路 通过射线获取命中点&#xff0c;作为材质参数材质中&#xff0c;命中的世界…

缺失msvcr110.dll要怎么处理?快捷的修复msvcr110.dll方法

当你在使用电脑进行工作或娱乐时&#xff0c;可能会突然遇到一个错误提示&#xff1a;“程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll”。这样的情况不仅会打断你的活动&#xff0c;还可能带来一定程度的不便。面对这个在Windows操作系统中相对常见的问题&#xff0c;其…

JavaEE实验三:3.5学生信息查询系统(动态Sql)

题目要求: 使用动态SQL进行条件查询、更新以及复杂查询操作。本实验要求利用本章所学知识完成一个学生信息系统&#xff0c;该系统要求实现3个以下功能: 1、多条件查询&#xff1a; 当用户输入的学生姓名不为空&#xff0c;则根据学生姓名进行学生信息的查询&#xff1b; 当用户…

将Ubuntu18.04默认的python3.6升级到python3.8

1、查看现有的 python3 版本 python3 --version 2、安装 python3.8 sudo apt install python3.8 3、将 python3.6 和 3.8 添加到 update-alternatives sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 sudo update-alternatives --insta…

开发日志2024-04-11

开发日志2024/04/11 1、会员/普通用户预约完成后&#xff0c;技师对应的积分添加预约完成的项目价格添加到统计表的业绩字段中&#xff0c;同时对应的服务次数字段1 实现代码&#xff1a; 前端 shHandler(){this.$confirm(确定操作?, "提示", {confirmButtonText…

flutter跑通腾讯云直播Demo

运行示例 前提条件 要求java jdk 11版本 并且配置到了环境变量 重要 要求flutter 版本 2.8.0 并且配置到了环境变量 重要 要求dart-sdk版本2.15 并且配置到了环境变量 重要 您已 注册腾讯云 账号&#xff0c;并完成 实名认证。 申请 SDKAPPID 和 SECRETKEY 登录实时音视频控…

Leetcode 406. 根据身高重建队列

心路历程&#xff1a; 看到二维数组的排序问题&#xff0c;第一反应想到了之前合并区间那道题先对数组按照第一维排序&#xff0c;后来在纸上模拟后发现&#xff0c;如果按照第一维度降维&#xff0c;第二维度升维的方式排序&#xff0c;那么后面插入的元素一定不会影响前面的…