wait函数与waitpid函数

1. 通过man命令学习wait和waitpid函数的用法





wait与waitpid函数头文件与定义

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

wait函数功能:父进程一旦调用wait函数就立即阻塞自己,由wait分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回,如果没有找到,就一直阻塞,直至找到一个结束的子进程或接收到了一个指定的信号为止。
waitpid函数功能:waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能等。实际上wait()函数只是waitpid()函数的一个特例。

2. wait函数返回值意义

Wait()与fork()配套出现,如果在fork()之前调用wait(), wait返回-1,正常情况下,应返回子进程pid。参数wtatus用来保存被收集进程退出时的状态,它是一个指向int类型的指针,如果我们对这个子进程如何结束的不在意,只想把这个僵尸进程消灭掉,就把这个参数置为NULL,即

pid = wait(NULL);

如果成功返回子进程pid,如果没有子进程,失败,则返回-1。
如果如果status的值不是NULL,wait把子进程的退出状态取出并存入其中,这是一个整数值(int)它指出了子进程是正常退出还是非正常结束,以及正常结束的返回值,或被哪个信号结束等信息。使用macro来获取这些信息。

宏定义                         描述
WIFEXITED(wstatus)      如果进程子进程正常结束,返回一个非零值
WEXITSTATUS(wstatus)    返回子进程退出码;该值由状态参数的最低有效8位组成(仅
                        当WIFEXITED返回值非零时该macro才会被调用)
WIFSIGNALED(wstatus)    如果子进程被一个信号终止,则返回一个非零值
WTERMSIG(wstatus)       返回终止这个子进程的信号码(仅当WIFSIGNALED返回值非
                        零时该macro才能被调用)
WCOREDUMP(wstatus)      如果这个子进程生成了一个核心转储(core dump),返
                        回一个非零值(仅当WIFSIGNALED返回值非零时该macro才
                        会被调用)
WIFSTOPPED(wstatus)     如果子进程因接收一个信号暂停,返回一个非零值
WSTOPSIG(wstatus)       返回这个暂停信号的信号码(仅当WIFSTOPPED返回值非零
                        时该macro才会被调用)
WIFCONTINUED(wstatus)   如果子进程因接收一个信号而恢复运行,则返回一个非零值

编写代码并测试,结果如图所示




PS:abort()函数功能:立即终止当前进程,产生异常程序终止,此函数将SIGABRT信号发送给调用进程。

原文地址:https://www.cnblogs.com/w-a-n-s-d-j/p/11827982.html

时间: 2024-08-02 15:13:36

wait函数与waitpid函数的相关文章

UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数

lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这种信号的系统默认动作是忽略它. 在文档“进程控制三部曲”中,我们讲的第三部曲是使用 wait 函数来获取终止子进程的终止状态.那么,有几个问题我们这里需要详细的学习一下. 1. 父进程一定能够获取到子进程的终止状态吗?如果子进程在父进程调用 wait 函数前就终止了,怎么办? 2. 如果父进程没有获

waitpid 函数详解

关于Linux中waitpid函数的一些使用说明: #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t waitpid(pid_t pid,int * status,int options); waitpid函数有三个参数:pid和指向返回状态所在单元的指针和一个用来指定可选项的标识符.如果pid为-1 ,waitpid就等待任何一个子进程,如果pid>0 j就是等待pid指定的那个进程结束,参数pid还存在另外的两种可

UNIX多进程 - 销毁僵尸进程 - wait()和waitpid()函数

#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *statusPtr, int options); 现在要知道调用wait或waitpid的进程可能会发生什么情况: 如果其所有子进程都在运行,则阻塞. 如果一个子进程已经终止,正在等待的父进程获取到终止状态,则取得该子进程的终止状态立即返回. 如果他没有任何子进程,则立即出错返回. 如

【APUE】wait与waitpid函数

当一个进程终止时,内核就向其父进程发送SIGCHLD信号.因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数.对于这种信号的系统默认动作是忽略它. 调用wait或waitpid的进程发生的情况如下: 1.如果所有子进程都还在运行,则阻塞 2.如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回 3.如果它没有任何子进程,则立即出错返回 #include <sys/wait.h>

进程控制(七)---wait 和 waitpid 函数详解

进程的终止可以分为异常终止和正常终止. 当进程是正常终止的时候,子进程会通过 exit 函数向父进程传递终止状态: 当进程是异常终止的时候,内核(而不是进程)会传递给父进程一个信号编号值. 所以说无论子进程是正常终止还是异常终止,父进程都可以通过 wait 或者 waitpid 函数来获取到子进程的终止状态,通过参数 status. 无论子进程是正常终止还是异常终止 或者 子进程暂停了,内核都会向父进程发送一个 SIGCHLD 信号,但是父进程对于此信号的默认动作是忽略.当然我们也可以捕捉该信号

async(await)函数和 Generator 函数 区别

async 函数是 Generator 函数的语法糖. async 函数对 Generator 函数的改进体现在: 1. async 内置执行器. Generator 函数的执行必须靠执行器,需要调用 next() 方法,或者用co 模块:而 async 函数自带执行器.也就是说,async 函数的执行与普通函数一模一样,只要一行. 2. 更好的语义. async 和 await 比起星号和 yield,语义更清楚. 3.更广的适用性. co 模块约定,yield 命令后面只能是 Thunk 函

Python-lambda函数,map函数,filter函数

lambda函数主要理解: lambda 参数:操作(参数). lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值.lambda语句构建的其实是一个函数对象 map函数: map(function_to_apply, list_of_inputs).map函数可以把list_of_inputs内的对象依次输入到function_to_apply中进行操作. filter函数: filter(function_to_apply, list_of_inputs).Filter

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

oracle listagg函数、lag函数、lead函数 实例

Oracle大师Thomas Kyte在他的经典著作中,反复强调过一个实现需求方案选取顺序: “如果你可以使用一句SQL解决的需求,就使用一句SQL:如果不可以,就考虑PL/SQL是否可以:如果PL/SQL实现不了,就考虑Java存储过程是否可以:如果这些都不可能实现,那么就需要考虑你是否真的需要实现这个需求.” 各个关系型DBMS产品都在遵守关系型数据库模型的基本体系架构,遵循通用的SQL国际规范.同时,为了更好地配合自身数据库实现的特征,以及提供更加丰富的功能,各个DBMS纷纷在标准SQL上