wait、waitpid函数

来源:互联网 发布:买家淘宝退货流程图 编辑:程序博客网 时间:2024/06/03 21:22

当一个进程正常或异常终止,内核向其父进程发送SIGCHLD信号。父进程可以选择忽略该信号,或选择一个该信号发生时被调用执行的函数。

进程在收到SIGCHLD信号而调用wait可期望立即返回。否则可能会被阻塞。


当进程调用wait、waitpid时:

1.  如果没有子进程,立即出错返回-1

2.  如果所有子进程还在运行,则进程阻塞

3.  如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回


函数原型:

#include <sys/wait.h>

pid_t  wait(int  *statloc);

pid_t  wait(pid_t  pid,  int  *statloc,  int  options);


函数出错返回-1, 成功返回进程ID


函数区别如下:

1.  在一个子进程终止前,wait使调用者阻塞,而waitpid可以设置使调用者不阻塞

2.  waitpid有若干选项,可以控制等待的进程。

3.  waitpid支持作业控制


函数参数:

statloc : 整型指针,如果非空,则存放终止进程的终止状态。

pid: 

    pid = -1 : 等待任一子进程。与wait等效

    pid > 0  : 等待进程ID = pid 的子进程

    pid = 0  : 等待组ID等于调用进程组ID的任一子进程

    pid < -1 : 等待组ID等于pid绝对值的任一子进程


对于wait,出错是由于调用进程没有子进程,对与waitpid,如果指定的进程或进程组不存在,或pid指定的进程不是调用进程的子进程都会出错


options: 该参数可以进一步控制waitpid操作。可以是0,或下列常量的“或”运算结果:

    WCONTINUED: 若实现支持作业控制,则由pid指定的任一子进程在暂停后已经继续,但其状态尚未报告,则返回其状态。

    WNOHANG     :若由pid指定的子进程不是立即可用的,则waitpid不阻塞,并返回0

    WUNTRACED:若某实现支持作业控制,而由pid指定的任一子进程已处于暂停状态,并且其状态自暂停以来尚未报告过,则返回其状态。


对于wait和waitpid返回的终止状态,可以用下列宏来进行检查:

    WIFEXITED(status)        : 若为正常终止子进程返回的状态,则为真。这时可用WEXITSTATUS(status)取子进程传送给exit、_exit、_Exit参数的低8位。

    WIFSIGNALED(status      : 若为异常终止子进程返回的状态,则为真。这时可用WTERMSIG(status)取使子进程终止的 信号编号。

    WIFSTOPPED(status)      : 若为当前暂停子进程返回的状态,则为真。这时可用WSTOPSIG(status)取使子进程暂停的信号编号。

    WIFCONTINUED(status) : 若在作业控制暂停后已经继续的子进程返回了状态,则为真。


#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <sys/wait.h>void pr_exit(int status){if(WIFEXITED(status))printf("normal termination, exit status = %d\n", WEXITSTATUS(status));else if(WIFSIGNALED(status))printf("abnormal termination, signal number = %d\n", WTERMSIG(status));else if(WIFSTOPPED(status))printf("child stopped, signal number = %d\n", WSTOPSIG(status));}int main(void){intstatus;if(fork() == 0)exit(7);wait(&status);pr_exit(status);if(fork() == 0)abort();//generates SIGABRTwait(&status);pr_exit(status);if(fork() == 0)status /= 0;//divide by 0 generates SIGFPEwait(&status);pr_exit(status);exit(0);}

output:

normal termination, exit status = 7
abnormal termination, signal number = 6
abnormal termination, signal number = 8

0 0