代码分析:waitpid的使用,非阻塞轮回检测技术

wait 函数

wait函数的作用是父进程调用,等待子进程退出,回收子进程的资源;

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);返回值:
成功返回被等待进程pid,失败返回-1。
参数:
输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

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:参数为0:也就是阻塞版本的等待,也就是说该waitpid在子进程没有退出情况下就不会返回,就和wait的使用一模一样,因为wait的使用就是阻塞版本的等待方式;参数为WNOHANG: 这是一个宏,表示调用wait为非阻塞的版本,非阻塞也就以为执行带waitpid函数会立即返回;
而设置这个参数:返回情况有以下几种:若pid指定的子进程没有结束,则waitpid()函数返回0,父进程不予以等待;
若正常结束,则返回该子进程的ID;
若等待失败,即返回小于0。

waitpid 的options参数的理解

该参数设置:一般设置为WNOHANG:表示为父进程是以非阻塞的方式等待子进程;

但是非阻塞方式等待子进程退出就有几种情况:

1. 子进程没有退出,但是父进程调用的waitpid返回了0,这也表示等待子进程成功,只不过子进程没有退出,此时表示需要继续做父进程的事情;
2. 子进程退出了,父进程调用waitpid函数返回子进程的PID, 也就是等待成功了,这时候我们在父进程可以拿到子进程的退出状态信息;
3. waitpid等待子进程退出失败,waitpid就会返回小于0的值,此时就可以做一些输出错误信息给用户;

阻塞本质就是:调用该函数的父进程由在运行队列被放入到了等待队列中等待,同时修改进程状态为S。

waitpid返回的本质也就是:将该父进程从等待队列拿到运行队列中执行;

测试options:WNODHANG

非阻塞等待子进程;

一般而言我们会使用一种叫做非阻塞轮回检测技术来检测子进程的退出状态。也就是说:我希望子进程退出能够被我父进程检测到,同时我又不希望我父进程处于阻塞等待,也就是父进程不希望自己什么事都不可以做,只等子进程退出返回;使用while循环保持检测,直到子进程退出。

//父进程调用waitpid函数完成对子进程的回收
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main()
{//创建子进程pid_t pid = fork();if(pid<0) //fork失败的情况{perror("fork error");return -1;}else if(pid>0)//父进程{printf("father: [%d], pid==[%d], fpid==[%d]\n", pid, getpid(),getppid());int status;//该变量是父进程的变量,为的是在父进程获得子进程的退出状态的信息  /****************************************************这个循环就是继续轮回检测的非阻塞版本的设计,*假如子进程没退出,我们一直死循环检测知道直到它退出 ****************************************************/while(1){// -1表示任意子进程,WNOHANG:不阻塞pid_t wpid = waitpid(-1, &status, WNOHANG);printf("wpid==[%d]\n", wpid);	if(wpid > 0) //waitpid 等待成功,子进程退出,父进程就可以获取子进程的信息{if(WIFEXITED(status)) //正常退出{printf("child normal exit, status==[%d]\n", WEXITSTATUS(status));}else if(WIFSIGNALED(status)) //被信号杀死{printf("child killed by signal, signo==[%d]\n", WTERMSIG(status));}}else if(wpid == 0) //子进程还活着,表示waitpid等待成功,但是子进程还没有退出,waitpid返回0回到父进程的代码执行 {printf("Child is living, wpid == [%d]\n", wpid);}else if((wpid == -1) //子进程全部退出{printf("No child is living, wpid == [%d]\n", wpid);break;}}sleep(20);//让父进程每隔20秒去检测}else if(pid==0) //子进程{printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid());sleep(2);return 9;}return 0;
}

在这里插入图片描述

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

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

相关文章

LiveGBS流媒体平台GB/T28181常见问题-无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

LiveGBS无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查 1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查1.…

10*1000【1】

7.20号 讲了蚂蚁的运行方式和关键技术&#xff1a; 数字技术实现了对金融的改革&#xff0c;让它更包容。当然也实现了消费方式的改变&#xff0c;是得以用户为中心。同时虚拟技术让个人也有了一个自己的小公司&#xff0c;在互联网上面的信息与信用都会被记录下来&#xff0…

人工智能的缺陷

首先从应用层面理解什么是人工智能&#xff0c;目前人工智能主流应用面包括&#xff1a;自然语言处理领域&#xff0c;代表为chatgpt&#xff0c;我们能用其进行日常交流&#xff0c;问题答疑&#xff0c;论文书写等。计算机视觉领域&#xff0c;代表为人脸识别&#xff0c;现在…

【计算机视觉|风格迁移】PP-GAN:使用GAN的地标提取器将韩国人像的风格转化为身份证照片

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;PP-GAN : Style Transfer from Korean Portraits to ID Photos Using Landmark Extractor with GAN 链接&#xff1a;[2306.13418] PP-GAN : Style Transfer from Korean Portraits to ID…

uniapp 微信小程序 分包

1、manifest.json内添加如图所示&#xff1a; "optimization" : {"subPackages" : true },2、在与pages同级上创建各个分包的文件夹 把需要分包的文件对应移入分包文件夹内 3、page.json内修改分包文件的路径 比如&#xff1a; {"path" : &qu…

EtherCAT转Profinet网关连接西门子PLC与凯福科技总线步进驱动器通讯

西门子S7-1200/1500系列的PLC&#xff0c;采用Profinet实时以太网通讯协议&#xff0c;需要连接带EtherCAT的通讯功能的伺服驱动器等设备&#xff0c;就必须进行通讯协议转换。捷米特JM-EIP-RTU系列的网关提供了&#xff0c;快速可行的解决方案 捷米特JM-ECTM-PN在PROFINET一侧…

如何使用win10专业版系统自带远程桌面公司内网电脑,从而实现居家办公?

使用win10专业版自带远程桌面公司内网电脑 文章目录 使用win10专业版自带远程桌面公司内网电脑 在现代社会中&#xff0c;各类电子硬件已经遍布我们身边&#xff0c;除了应用在个人娱乐场景的消费类电子产品外&#xff0c;各项工作也离不开电脑的帮助&#xff0c;特别是涉及到数…

Diffusion扩散模型学习4——Stable Diffusion原理解析-inpaint修复图片为例

Diffusion扩散模型学习4——Stable Diffusion原理解析-inpaint修复图片为例 学习前言源码下载地址原理解析一、先验知识二、什么是inpaint三、Stable Diffusion中的inpaint1、开源的inpaint模型2、基于base模型inpaint 四、inpaint流程1、输入图片到隐空间的编码2、文本编码3、…

【瑞吉外卖项目复写】基本部分复写笔记

Day1 瑞吉外卖项目概述 mysql的数据源配置 spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/regie?serverTimezoneAsia/Shanghai&useUnicodetrue&characterEncodingutf-8&zeroDateTimeBehaviorconvertTo…

STM32 HAL 驱动PM2.5传感器(GP2Y10AU气体检测模块)

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库方式对G…

Element-plus中tooltip 提示框修改宽度——解决方案

tooltip 提示框修改宽度方法&#xff1a; 在element中&#xff0c;想要设置表格的内容&#xff0c;超出部分隐藏&#xff0c;鼠标悬浮提示 可以在el-table 上添加show-overflow-tooltip属性 同时可以通过tooltip-options配置提示信息 如下图代码 <el-tableshow-overflo…

中信银行与华为联合编制:《2023金融数据可信流通技术白皮书》

导读 中信银行与华为技术有限公司联合编制的《金融数据可信流通技术白皮书》&#xff0c;从技术、业务、管理、法律等维度探讨了金融业数据流通的现状、问题、机遇和挑战&#xff0c;并提出了一套金融业数据流通的技术解决方案。该方案基于华为OceanStor存储&#xff0c;结合…