wait waitpid
定义
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
暂时停止进程的执行,直到有信号来到或子进程结束
如果不在意结束状态值,则参数status 可以设成NULL
pid = wait(NULL);
wait实现
# vi unistd.h
static inline pid_t wait(int * wait_stat)
{
return waitpid(-1,wait_stat,0);
}
status
由于这些信息被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作
- WIFEXITED(status)
子进程正常退出(”exit”或”_exit”),此宏返回非0 - WEXITSTATUS(status)
获得子进程exit()返回的结束代码,一般先要用WIFEXITED判断是否正常结束。如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义 - WIFSIGNALED(status)
若为异常结束子进程返回的状态,则为真;对于这种情况可执行WTERMSIG(status),取使子进程结束的信号编号 - WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏
- WIFSTOPPED(status) 若为当前暂停子进程返回的状态,则为真;对于这种情况可执行WSTOPSIG(status),取使子进程暂停的信号编号
- WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏
waitpid
- pid<-1 等待进程组识别码为 pid 绝对值的任何子进程
- pid=-1 等待任何子进程,相当于 wait()
- pid=0 等待进程组识别码与目前进程相同的任何子进程
- pid>0 等待任何子进程识别码为 pid 的子进程
options
- WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID
- WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status)宏确定返回值是否对应与一个暂停子进程
举例
void sig_func(int sig)
{
pid_t pid = 0;
int status = 0;
pid = wait(&status);
if (WIFEXITED(status))
{
printf("the return code is %d.\n", WEXITSTATUS(status));
}
else
{
printf("the child process %d exit abnormally.\n", pid);
}
}
int main()
{
signal(SIGCHLD, sig_func);
if(fork() == 0)
{
printf("This is child process with pid of %d.\n", getpid());
exit(EXIT_SUCCESS);
}
while(1);
return 0;
}