wait函数与waitpid函数

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

wait函数与waitpid函数_第1张图片
wait函数与waitpid函数_第2张图片
wait函数与waitpid函数_第3张图片
wait函数与waitpid函数_第4张图片
wait与waitpid函数头文件与定义

#include
#include
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)   如果子进程因接收一个信号而恢复运行,则返回一个非零值

编写代码并测试,结果如图所示
wait函数与waitpid函数_第5张图片
wait函数与waitpid函数_第6张图片
wait函数与waitpid函数_第7张图片
wait函数与waitpid函数_第8张图片
PS:abort()函数功能:立即终止当前进程,产生异常程序终止,此函数将SIGABRT信号发送给调用进程。

你可能感兴趣的:(wait函数与waitpid函数)