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

news2024/10/5 17:23:30

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.coloradmin.cn/o/857601.html

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

相关文章

B2B2C小程序商城系统--跨境电商后台数据采集功能开发

搭建一个B2B2C小程序商城系统涉及到多个步骤和功能开发&#xff0c;其中包括跨境电商后台数据采集功能的开发。具体搭建步骤如下&#xff1a; 一、系统搭建 1. 确定需求和功能&#xff1a;根据B2B2C商城的需求&#xff0c;确定系统的功能和模块&#xff0c;包括商品管理、订单…

大数据离线阶段02:Apache Hadoop

Hadoop介绍 Hadoop是Apache旗下的一个用java语言实现开源软件框架&#xff0c;是一个开发和运行处理大规模数据的软件平台。允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理。 狭义上说&#xff0c;Hadoop指Apache这款开源框架&#xff0c;它的核心组件有…

一款用于监控电路监控数字系统中的电源 电压监控器 CAT809STBI-GT3

什么是电压监控器&#xff1f; 电压监控器是一种用于监测电力系统中电压水平的设备。它通常用于检测电压的变化、波动或异常情况&#xff0c;以确保电力系统的稳定运行。电压监控器可以监测不同电压水平&#xff0c;例如交流电系统中的电压、直流电系统中的电压等并将其显示在…

【中危】 Apache Traffic Server Range 标头验证不当

漏洞描述 Apache Traffic Server&#xff08;ATS&#xff09;是一个开源的反向代理和缓存服务器。 受影响版本中&#xff0c;由于 HttpTransact 类未对无效 Range 标头进行过滤&#xff0c;并且 URL 类未对传入 URL 参数的重复斜杠进行过滤&#xff0c;攻击者可利用此漏洞对 …

docker-compose部署milvus

部署milvus 上一篇介绍了使用kubernetes来部署milvus&#xff0c;这篇介绍下使用docker-compose来部署milvus。 下载docker-compose docker-compose的Github地址https://github.com/docker/compose/releases下载最新版的 docker-compose-linux-x86_64 在服务器上使用 wget …

问道管理:燃气板块拉升走高,胜通能源涨停,欧洲天然气价飙升

燃气板块10日盘中发力走高&#xff0c;到发稿&#xff0c;美能动力、胜通动力、水发燃气涨停&#xff0c;首华燃气涨约8%&#xff0c;山东墨龙、贵州燃气涨逾7%&#xff0c;贝肯动力涨逾5%。 消息面上&#xff0c;因液化天然气供给危险添加&#xff0c;美国天然气期货日内大涨7…

【数据结构OJ题】合并两个有序数组

原题链接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 看到这道题&#xff0c;我们注意到nums1[ ]和nums2[ ]两个数组都是非递减的。所以我们很容易想到额外开一个数组tmp[ ]&#x…

大运空瓶行动,绘就生态文明画卷

随着成都第31届世界大学生夏季运动会赛事的成功举办&#xff0c;为了倡导节约水资源、绿色大运&#xff0c;在此之前成都电视2台《城视民生》栏目面向全市发起“大运空瓶行动”的倡议&#xff0c;呼吁市民杜绝水资源浪费&#xff0c;喝完瓶中水&#xff0c;并鼓励市民积极参与到…

vscode-启动cljs

打开vscode &#xff0c;打开cljs项目文件 先npm installvscode安装插件Calva: Clojure & ClojureScript启动REPL 选择Start yout project with a REPL and connect(a.k.a. jack) 后选择shadow-cljs&#xff0c;然后选择shadow&#xff0c;如果需要选择build的话&#xf…

【香瓜说职场】漫长的瓶颈期(2019.03.29)

自从17年4月份开始辞职创业&#xff0c;已经2年了。聊聊近况。 一、公司现状 1、关于淘宝店 淘宝店上架了些开发板相关的衍生产品&#xff0c;单品销量很低&#xff0c;但通过种类来获取销售额。尽管如此&#xff0c;依然不足以支付我和客服两人的工资费用。每月亏损几千。 2、…

【插入排序】直接插入排序 与 希尔排序

目录 1. 排序的概念&#xff1a; 2.插入排序基本思想 3.直接插入排序 4.希尔排序 1. 排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xf…

儿童滑梯CE认证标准EN71测试标准

我国是玩具出口大国&#xff0c;目前的主要出口目标市场是欧洲市场&#xff0c;其中出口欧洲市场的玩具平均约占据我国玩具年出口额的40%左右。 EN 71是欧盟国家强制执行的标准&#xff0c;针对为14岁以下的儿童设计的玩具。其意义是通过EN71标准对进入欧洲市场的玩具产品进行…

flowable-ui部署(6.80)

前置条件&#xff1a;Apache Tomcat/9.0.78版本及以下 https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.78/bin/apache-tomcat-9.0.78-windows-x64.zip 一、下载资源 https://github.com/flowable/flowable-engine/releases/download/flowable-6.8.0/flowable-6.8.0.zip 二…

如何用瀑布图分析公司年报

原创&#xff1a; MicroStrategy微策略中国 , Jiping Sun 微策略企业级数据分析与移动应用9月21日2018年 摘要&#xff1a;利用达析报告开箱即用的瀑布图来展示各个度量值如何增加或减少。下载MicroStrategy Desktop 10.11以上版本&#xff0c;自己动手创建瀑布图。 瀑布图是由…

日常开发中Git命令指北

Git基本操作 创建化仓库 mkdir 目录 cd 目录 git init配置本地仓库 # 配置用户名&#xff0c;邮箱 git config user.name "cxf" git config user.email "1969612859qq.com" # 查看本地配置&#xff08;小写的 L&#xff09; git config -l # 重置配置&a…

C语言函数详解(1)

目录 函数是什么 C语言中函数的分类 库函数 自定义函数 函数的参数 实际参数&#xff08;实参&#xff09; 形式参数&#xff08;形参&#xff09; 函数的调用 传值调用 传址调用 练习 函数的嵌套调用和链式访问 嵌套调用 链式访问 函数是什么 数学中我们常见到函…

【链表OJ 2】反转链表

前言: &#x1f388;欢迎大家来到Dream_Chaser&#xff5e;的博客&#x1f388; &#x1f6a9;本文收录于 C--数据结构刷题的专栏中 -->http://t.csdn.cn/n6UEP 首先欢迎大家的来访&#xff0c;其次如有错误&#xff0c;非常欢迎大家的指正,互相学习进步。 一.反转链表 来…

【高危】 Microsoft Exchange Server 远程代码执行漏洞

漏洞描述 Microsoft Exchange Server 是微软公司开发的一款邮件服务器。 Microsoft Exchange Server 受影响版本中&#xff0c;具有普通用户权限&#xff08;Exchange 用户凭据&#xff09;的攻击者可能在同一内网环境中攻击Exchange服务&#xff0c;远程执行任意代码。 由于…

【学习】若依源码(前后端分离版)之 “ 上传图片功能实现”

大型纪录片&#xff1a;学习若依源码&#xff08;前后端分离版&#xff09;之 “ 上传图片功能实现” 前言前端部分后端部分结语 前言 图片上传也基本是一个项目的必备功能了&#xff0c;所以今天和大家分享一下我最近在使用若依前后端分离版本时&#xff0c;如何实现图片上传…

Oracle到DM实时数据同步实施方案

目录 1 项目概述 2 需求分析 3 实施操作 3.1 历史数据全量同步 3.2 增量数据实时同步 4 问题总结 4.1 字符型非空约束 4.2 字符型唯一索引尾部空格 1 项目概述 将Oracle 11g RAC生产环境数据同步到DM8分析环境&#xff0c;Oracle数据库大小1.5T&#xff0c;日增归档10…