5.等待函数
(1)wait和waitpid
头文件
#include
#include
函数
pid_t wait(int* status);
pid_t waitpid(pid_t pid, int* status, int options);
返回值
成功返回子进程ID,出错返回-1
功能
等待子进程退出并回收,防止僵尸进程的产生
参数
(1)status参数:
①为空时,代表任意状态结束的子进程;
②不为空时,则等待指定状态结束的子进程
(2)waitpid的pid参数
①pid == -1 :等待任一子进程,功能与wait等效。
②pid > 0 :等待其进程ID与pid相等的子进程
③pid == 0:等待其组ID等于调用进程的组ID的任一子进程
④pid < -1:等待其组ID等于pid的绝对值的任一子进程。
(3)options参数
①WNOHANG:如果pid子进程未结束则立即返回,不会阻塞,此时返回值为0。如果pid进程己退出,则返回这个进程的pid。
②WUNTRACED:使waitpid报告那些己经被停止的未报告子进程的状态。
备注
wait的waitpid的区别:
①在一个子进程终止前,wait使用调用者阻塞
②waitpid的options可使调用者不阻塞
③waitpid等待一个指定的子进程,而wait等待所有的子进程,返回任一终止子进程的状态。
(2)检查wait和waitpid函数返回的终止状态的宏
判断终止状态
获取终止状态值
说明
WIFEXITED(status)
WEXITSTATUS(status)
判断子进程是否正常终止及获取退出码
WIFSIGNAL(status)
WTERMSIG(status)
判断子进程是否异常终止及获取异常终止的信号编码
WIFSTOPED(status)
WSTOPSIG(status)
判断子进程是否被暂停及获取暂停的信号编码
【编程实验】判断进程的终止状态
//process_wait.c
#include #include#include#include
void out_status(intstatus)
{if(WIFEXITED(status)){
printf("normal exit: %d\n", WEXITSTATUS(status));
}else if(WIFSIGNALED(status)){
printf("abnormal terminate: %d\n", WTERMSIG(status));
}else if(WIFSTOPPED(status)){
printf("Stopped signal: %d\n", WSTOPSIG(status));
}else{
printf("unknow signal\n");<