当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。

对于这种信号的系统默认动作是忽略它。

  • 如果其所有子进程都还在运行,则阻塞
  • 如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回
  • 如果它没有任何子进程,则立即出错返回

如果进程由于接收到SIGCHLD信号而调用wait,我们期望wait会立即返回。但是如果在随机时间点调用wait,则进程可能会阻塞。

#include <sys/wait.h>

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

这两个函数的区别如下:

  • 在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
  • waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。

如果子进程终止,并且是一个僵死进程,则wait立即返回并取得该子进程的状态;

否则wait使其调用者阻塞,直到一个子进程终止。如调用者阻塞而且它有多个子进程,则在其某一子进程终止时,wait就立即返回。

因为wait返回终止子进程的ID,所以它总能了解是哪一个子进程终止了。

这两个函数的参数statloc是一个整型指针。如果statloc不是一个空指针,则终止进程的终止状态就存放在它所指向的单元内。如果不关心终止状态,则可将该参数指定为空指针。

对于waitpid函数中pid参数的作用解释如下自爱。

  • pid == -1 等待任一子进程。此种情况下,waitpid与wait等效。
  • pid > 0 等待进程ID与pid相等的子进程。
  • pid == 0 等待组ID等于调用进程组ID的任一子进程。
  • pid < -1 等待组ID等于pid绝对值的任一子进程。

waitpid函数返回终止子进程的进程ID,并将该子进程的终止状态放在由statloc指向的存储单元中。

对于wait,其唯一的出错信息是调用进程没有子进程。

waitpid函数提供了wait函数没有提供的三个功能。

  • waitpid可等待一个特定的进程,而wait则返回任一终止子进程的状态。
  • waitpid提供了一个wait的非阻塞版本。有时希望获取一个子进程的状态,但不想阻塞。
  • waitpid通过WUNTRACED和WCONTINUED选项支持作业控制。

results matching ""

    No results matching ""