- 通过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()函数的一个特例。
- 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信号发送给调用进程。