一、wait和waitpid函数

  当一个进程正常或异常终止时会向父进程发送SIGCHLD信号。对于这种信号系统默认会忽略。调用wait/waidpid的进程可能会:

  • 阻塞(如果其子进程都还在运行);

  • 立即返回子进程的终止状态(如果一个子进程已经终止正等待父进程存取其终止状态);

  • 出错立即返回(如果它没有任何子进程);
    如果进程由于收到SIGCHLD信号而调用wait,则可期望wait会立即返回。但是在任一时刻调用则进程可能阻塞。

#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *statloc);pid_t waitpid(pid_t pid, int *statloc, int options);
返回值: 成功返回进程ID, 出错-1.

  这两个函数区别:

  • wait如果在子进程终止前调用则会阻塞,而waitpid有一选项可以使调用者不阻塞。

  • waitpid并不等待第一个终止的子进程--它有多个选项,可以控制它所等待的进程。

如果调用者阻塞而且它有多个子进程,则在其一个子进程终止时,wait就立即返回。因为wait返回子进程ID,所以调用者知道是哪个子进程终止了。
  参数statloc是一个整型指针。如果statloc不是一个空指针,则终止状态就存放到它所指向的单元内。如果不关心终止状态则将statloc设为空指针。
  这两个函数返回的整型状态由实现定义。其中某些位表示退出状态(正常退出),其他位则指示信号编号(异常返回),有一位指示是否产生了一个core文件等等。POSIX.1规定终止状态用定义在<sys/wait.h>中的各个宏来查看。有三个互斥的宏可用来取得进程终止的原因,它们的名字都已WIF开始。基于这三个宏中哪一个值是真,就可选用其他宏(这三个宏之外的其他宏)来取得终止状态、信号编号等。
  平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

  下面的程序中pr_exit函数使用上表中的宏以打印进程的终止状态。

#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.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), 
    #ifdef WCOREDUMP
        WCOREDUMP(status) ? &