wait和waitpid函数总结

【进程控制】超详细讲解wait和waitpid的原理(结合代码) 在了解了进程状态这一概念之后,我们明白了什么叫做僵尸进程:子进程退出,父进程“不管不顾”。而一旦存在僵尸进程,势必也会存在内存泄露问题,所以作为一个父进程,及时处理子进程的退出信息是他的责任。那么子进程的退出信息到底是什么?以及父进程怎么接收到子进程的退出信息?本文章重点围绕这两个问题展开叙述。进程等待进程等待是指一个进程暂停执行,等待另一个进程的结束。最常见的是父进程等待自己的子进程,或者父进程回收自己的子进程资源包括僵尸进程。等待方法有:wait函数和waipid函数。 阅读详情

wait和waitpid两个函数的功能:

1.防止产生僵尸进程             

2.根据需求,先让父进程挂起等待子进程结束后,再运行,实现进程的同步。


僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。


wait函数:

函数原型:

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

pid_t wait(int *status)


进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。

参数status:

如果参数status的值不是NULL,wait就会把子进程退出时的状态取出并存入其中,这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的,以及正常结束时的返回值,或被哪一个信号结束的等信息。由于这些信息被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作:

1.WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。
2. WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。
但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:
 pid = wait(NULL);

3.WIFSIGNALED(status)若为异常结束子进程返回的状态,则为真;对于这种情况可执行WTERMSIG(status),取使子进程结束的信号编号。

4.WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。

5.WIFSTOPPED(status) 若为当前暂停子进程返回的状态,则为真;对于这种情况可执行WSTOPSIG(status),取使子进程暂停的信号编号。

6.WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。



如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。



waitpid函数:

函数原型:

#include <sys/types.h> 
#include <sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options)


从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式。下面我们就来详细介绍一下这两个参数:


参数pid:

从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。

pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。 
pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。 
pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。 


参数options:

ptions提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用,比如:
ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);
 
如果我们不想使用它们,也可以把options设为0,如:
ret=waitpid(-1,NULL,0);
 
如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。

WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。
WCONTINUED //如果停止了的进程由于SIGCONT信号的到来而继续运行,调用将返回。


waitpid的返回值比wait稍微复杂一些,一共有3种情况:

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





waitpid函数详解+应用示例 来源:微信公众号「编程学习基地」 文章目录waitpid函数的使用waitpid()函数定义参数详解使用示例 waitpid函数的使用 当用fork启动一个新的子进程的时候,子进程就有了新的生命周期,并将在其自己的地址空间内独立运行。但有的时候,我们希望知道某一个自己创建的子进程何时结束,从而方便父进程做一些处理动作。 waitpid()函数定义 先来看看waitpid函数的定义: #include <sys/types.h> #include <sys/wait.h> .. 阅读详情

相关推荐

PDDL入门

PDDL的组成部分 Objects:对象,世界上我们感兴趣的事物。 Predicates:谓词,我们感兴趣的事实(例如对象的属性),可以为真,也可以为假。 An initial state:初始化状态,我们开始所处的世界状态,即开始时为真的事物。 Goal specification:目标状态,我们想要结束的世界的状态,即我们希望最终成为真实的事情。 Actions/Operators:动作/操作,改变世界状态的方式,即发生的事情改变了事实。 PDDL语法 PDDL 文件的扩展名通常是.pddl 要

工控小白2021的博客 4821

waitpid()函数详解

一、前言 首先在了解waitpid()函数之前,我们需要先明确以下几个概念。 1.进程状态 从程序员的角度,我们可以认为进程总是处于下面三种状态之一: (1)运行。进程要么在CPU上执行,要么在等待被执行且最终会被内核调度。 (2)停止。进程的执行被挂起(suspended),且不会被调度。当收到SIGSTOP、SIGTSTP、SIGTTIN或者SIGTTOU信号时,进程就停止,并且保持停止直到他收到一个SIGCONT信号,在这个时刻,进程再次开始运行。 (3)终止。进程永远的停...

weixin_45227610的博客 2万+

带挂牵引车倒车运动模型推导及仿真实现

半挂牵引车在倒车时,由于鞍座主销的连接限制,其运动方式与乘用车有显著差异。例如,乘用车在右侧倒车入库时,只需确定泊车起点并将方向盘向右打死。相反,牵引车在倒车时需要先向左转方向盘,当铰接角达到防折叠的临界值时,再将方向盘向右转回,以调整牵引车与挂车至直线状态,完成泊车入库。本研究旨在建立一个基于牵引车带挂车倒车运动学模型,该模型基于以下假设: 道路在车辆行驶过程中保持平坦,无凹凸不平; 车辆以低速行驶,且在运行过程中车身不发生侧倾或俯仰; 行驶过程中,轮胎无变形,无侧向滑动,且不产

jianmo的博客 2697

3.4.8.waitpid(等待指定子进程的pid)介绍

等待回收PID为pid的这个子进程,如果当前进程并没有一个ID号为pid的子进程,则返回值为-1;-1表示不等待某个特定PID的子进程而是回收任意一个子进程,0表示用默认的方式(阻塞式)来进行等待,返回值ret是本次回收的子进程的PID。/* 这里一定是 子进程 , 子进程先结束,成为僵尸进程 ,一定要保证子进程先结束 */printf("子进程已经被回收,子进程pid = %d \n", ret);把 sleep 加入到 父进程 ,让子进程先结束,子进程进入僵尸进程后 ,父进程 去回收。

liang的博客 2719

鸿蒙平板PC应用开发:在termux中安装ubuntu

打开AVNC点击右上角的设置图标,然后点击 输入 , 点击手势栏目中的 单指轻扫 ,选择滚动远程内容

DMZDAMS的博客 5199

【LDLTS解析】从重叠峰到精准参数:拉普拉斯深能级瞬态光谱如何重塑半导体缺陷分析

本文深入解析了拉普拉斯深能级瞬态光谱(LDLTS)技术如何革新半导体缺陷分析。针对传统DLTS难以分辨重叠峰的痛点,LDLTS通过拉普拉斯逆变换对高精度电容瞬态曲线进行数学解卷积,成功分离发射率相近的缺陷信号,实现从模糊宽峰到精准独立峰的转变。该技术不仅大幅提升了缺陷激活能和捕获截面等关键参数的提取精度,更推动分析范式从经验拟合转向第一性原理,为先进半导体工艺开发与良率提升提供了强大的精准诊断工具。

weixin_29224309的博客 273

进程等待函数(waitpid)

waitpid函数原型如下: pid_t waitpid(pid_t pid , int *status , int options) 与wait函数相比,系统调用二者的作用是完全相同的,但是waitpid多出了两个可由用户控制的参数pid和options。 pid:从参数的名字上可以看出来这是一个进程的ID。但是这里pid的值不同时,会有不同的意义。 1.pid > 0时,只等待进程ID等于pid的子进程,只要该子进程不结束,就会一直等待下去; 2.pid = -1时,等待任何一个子进程的退出,此时

mlc741295821的博客 9214

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 188

wait()函数和waitpid()函数详解

文章目录wait()函数waitpid()函数wait() 和 waitpid() 用法和比较 wait()函数 #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status);   进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wa

To the beyond and infinity! 5340

【ComfyUI 基础教程】ComfyUI 局部重绘工作流教程

本篇指南将带你了解 ComfyUI 中的局部重绘工作流,并带你完成一个局部重绘的示例,以及遮罩编辑器的使用等。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 301

AI上推荐 之 逻辑回归模型与GBDT+LR(特征工程模型化的开端)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 8251

wait和waitpid函数和使用

一、wait函数 1.函数功能: ① 阻塞父进程,等待子进程退出 ② 回收子进程残留资源 ③ 获取子进程退出状态(原因)存放在参数中 2.函数包含头文件: #include <sys/types.h> #include <sys/wait.h> 3.函数原型: pid_t wait(int *wstatus); 4.函数参数: ① wstatus——一个整型数指针 · 当wstatus为NULL时:不关心子进程退出的状态 · 当wstatus不为NULL时:子进程退出状态

weixin_49840285的博客 2584

Vue3+Openlayers教程导航页【目录】

欢迎来到 Vue3+Openlayers 系列教程,这里是我在 优快云 编写的所有 Vue3+Openlayers 系列相关文章的索引页,适合初学者到进阶用户系统阅读。👀 更多教程正在持续更新中,欢迎关注我,一起探索 Openlayers 的强大魅力!

小彭的博客 1260

wait和waitpid函数

(1)wait函数说明当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件,这种信号也是内核向父进程发的异步通知。父进程可以忽略该信号,或者提供一个该信号发生时即被调用执行的函数(信号处理程序)。父进程同步等待子进程退

guoping16的专栏 6721

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

wait()和waitpid()函数

1)wait()和waitpid()函数说明     wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。如果该父进程没有子进程或者它的子进程已经结束,则wait()就会立即返回。     waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功

zwj0403的专栏 1747

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

wait()函数,waitpid()函数

1.wait() 函数,waitpid函数() 头文件:#include   #include 函数原型:pid_t   wait(int *statloc); pid_t   waitpid(pid_t  pid,int *statloc,int options); 函数说明:wait函数使父进程暂停执行,直到它的一个子进程结束为止,该函数的返回值是终止运行的子进程的PID.参数stat

杨龙飞的博客 2883

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

signal、wait、waitpid函数

signal、wait、waitpid函数

weixin_65437579的博客 804

wait以及waitpid函数使用

wait以及waitpid函数是干嘛的? 可以用来回收子进程结束的相关信息 wait: #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> int main(void) {...

qq_33472414的博客 203

linux下的wait函数和waitpid函数介绍

当前进程一旦调用了wait函数,就立即阻塞当前进程,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息, 并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。 wait(等待子进程中断或结束) 相关函数 waitpid,fork 需要头文件 #include #i

linuxOOstudy的专栏 815

wait函数与waitpid函数

调用wait函数的进程会被挂起(阻塞),直到它的一个子进程退出或者收到一个不能被忽略的信号时才被唤醒(相当于继续往下执行);-int *wstatus:进程退出时的状态信息,传入的是一个int类型的地址,传出参数。功能:等待任意一个子进程结束,如果该子进程结束了,此函数会回收子进程的资源。-失败:-1(所有子进程都结束/调用函数失败)-成功:返回被回收的子进程的id;如果没有子进程了,函数立刻返回,返回-1;如果子进程都已经结束了,也会立即返回-1.

ME_Liao_2022的博客 352

wait/waitpid函数详解

#include<sys/types.h> #include<sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); 特殊参数和返回情况: 参数pid: >0 回收指定ID的子进程 -1 回收任意子进程(相当于wait...

qq_25048473的博客 1484

【Linux】wait函数和waitpid函数

wait函数和waitpid函数的介绍

mhyasadj的博客 293

进程控制之函数wait、waitpid、waitid、wait3和wait4

文章目录函数wait和waitpid函数`waitid`函数`wait3`和`wait4` 函数wait和waitpid 调用wait和waitpid函数进程会发生什么。 如果其所有子进程都还在运行,则阻塞。 如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。 如果它没有任何子进程,则立即出错返回。 #include <sys/wait.h> pi...

Dunk.Wan 1808

【Linux】wait()和waitpid()函数

在Linux或Unix系统中,子进程只能由父进程进行回收。 如果进程结束但是进程资源仍未被回收,这个进程将会变为僵尸进程,会导致内存泄漏和系统性能下降。 使用getchar() 阻塞父进程的执行,子进程结束后父进程未对其进行回收

努力让自己的能力配得上梦想. 1080

wait()/waitpid()函数使用

wait()函数作用 阻塞并等待子进程退出 回收子进程残留资源 获取子进程结束状态(退出原因) 函数原型 pid_t wait(int *status); status参数: WIFEXITED(status):为非0 → 进程正常结束 WEXITSTATUS(status):获取进程退出状态 WIFSIGNALED(status):为非0 → 进程异常终止 WTERMSIG(status): 取得进程终止的信号编号。 返回值: 成功:清理掉子进程ID; 失败:-1(没有子进程) //父

weixin_46211877的博客 307
上一篇: 总结如何创建一个守护进程
下一篇: 实现简单的printf函数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值