学习Linux命令 - 等一下

名称

等待,waitpid - 等待进程终止

概要

#include
#include

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

描述

等待函数暂停当前进程的执行,直到孩子退出,或者直到一个信号被传递,其行动是终止当前进程或调用信号处理函数。 如果一个孩子在通话结束时已经退出(所谓的“僵尸”进程),该函数立即返回。 任何由孩子使用的系统资源都将被释放。

waitpid函数暂停当前进程的执行,直到由pid参数指定的子进程退出,或者直到传递了一个信号,该信号的作用是终止当前进程或调用信号处理函数。 如果在pid请求的孩子已经退出通话时(所谓的“僵尸”进程),该函数立即返回。 任何由孩子使用的系统资源都将被释放。

pid的值可以是下列之一:

<-1

意味着等待进程组ID等于pid绝对值的任何子进程。

-1

这意味着等待任何儿童进程; 这是等待展品的行为。

0

这意味着等待进程组ID等于调用进程的任何子进程。

> 0

这意味着等待进程ID等于pid值的子进程。

选项的值是零个或多个以下常量的或:

WNOHANG

这意味着如果没有孩子退出就立即返回。

WUNTRACED

这意味着还要为已停止的儿童返回,而且其状态尚未报告。

(仅适用于Linux,请参阅下文。)

如果状态不为NULL ,则在状态指向的位置等待waitpid存储状态信息。

这个状态可以用下面的宏来评估(这些宏将stat缓冲区(一个int )作为参数---不是指向缓冲区的指针!):

WIFEXITED( 状态

如果孩子正常退出,则不为零。

WEXITSTATUS( 状态

评估为终止的子代码的最低有效位8位,它可能已被设置为对exit()的调用的参数或者作为主程序中的返回语句的参数。 只有在WIFEXITED返回非零值时才能评估此宏。

WIFSIGNALED( 状态

如果子进程由于未捕获到的信号而退出,则返回true。

WTERMSIG( 状态

返回导致子进程终止的信号的编号。 只有在WIFSIGNALED返回非零值时才能评估此宏。

WIFSTOPPED( 状态

如果导致返回的子进程当前停止,则返回true; 这只有在使用WUNTRACED完成呼叫时才有可能。

WSTOPSIG( 状态

返回导致孩子停止的信号的数量。 只有在WIFSTOPPED返回非零值时才能评估此宏。

一些版本的Unix(例如Linux,Solaris,但不是AIX,SunOS)也定义了一个宏WCOREDUMP( status 来测试子进程是否转储核心。 只能在#ifdef WCOREDUMP ... #endif中使用。

返回值

退出的子进程ID,如果使用WNOHANG且没有可用的子进程,则为零,或者错误时为-1(在这种情况下,将errno设置为适当的值)。

错误

ECHILD

如果过程中指定 pid不存在或不是调用进程的子进程。 (如果将SIGCHLD的操作设置为SIG_IGN,则可能发生在自己的孩子身上,另请参阅关于线程的LINUX NOTES部分。)

EINVAL

如果选项参数无效。

EINTR

如果没有设置WNOHANG ,并且未捕获信号或SIGCHLD被捕获。