8.6 进程控制_wait和waitpid
2010-05-18 15:15
417 查看
当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知。
调用wait或waitpid的进程可能会发生什么情况:
如果其所有子进程都还在运行,则阻塞。
如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
如果它没有任何子进程,则立即出错返回。
如果进程由于接收到SIGCHLD信号而调用wait,则可期望wait会立即返回。但是如果在任意时刻调用wait,则进程可能会阻塞。
#include <sys/wait.h>
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
两个函数返回值:若成功则返回进程ID,0,若出错则返回-1
两个函数的区别如下:
在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。
如果一个进程已经终止,并且是一个僵死进程,则wait立即返回并取得该子进程的状态,否则wait使其调用者阻塞直到一个子进程终止。wait返回终止子进程的进程ID。
这两个函数的参数statloc是一个整型指针。如果statloc不是一个空指针,则终止进程的终止状态就存放在它所指向的单元内。如果不关心终止状态,则可将该参数指定为空指针。
依据传统,这两个函数返回的整型状态字是由实现定义的。其中某些位表示退出状态(正常返回),其他位则指示信号编号(异常返回),有一位指示是否产生一个core文件等。
对于waitpid函数中pid参数的作用解释如下:
pid ==-1 等待任一子进程。就这一方面言,waitpid与wait等效。
pid > 0 等待其进程ID与pid相等的子进程。
pid == 0 等待其组ID等于调用进程组ID的任一子进程。
pid < -1 等待其组ID等于pid绝对值的任一子进程。
waitpid函数返回终止子进程的进程ID,并将该子进程的终止状态存放在由statloc指向的存储单元中。对于wait,其唯一的出错是调用进程没有子进程(函数调用被一个信号中断时,也可能返回另一种出错)。但是对于waitpid,如果指定的进程或进程组不存在,或者参数pid指定的进程不是调用进程的子进程则都将出错。
options参数使我们能进一步控制waitpid的操作。
图8.1 waitpid的options常量
waitpid函数提供了wait函数没有提供的三个功能:
waitpid可等待一个特定的进程,而wait则返回任一终止子进程的状态。在讨论popen函数时在说明这一功能。
waitpid提供了一个wait的非阻塞版本。
waitpid支持作业控制。
调用wait或waitpid的进程可能会发生什么情况:
如果其所有子进程都还在运行,则阻塞。
如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
如果它没有任何子进程,则立即出错返回。
如果进程由于接收到SIGCHLD信号而调用wait,则可期望wait会立即返回。但是如果在任意时刻调用wait,则进程可能会阻塞。
#include <sys/wait.h>
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
两个函数返回值:若成功则返回进程ID,0,若出错则返回-1
两个函数的区别如下:
在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。
如果一个进程已经终止,并且是一个僵死进程,则wait立即返回并取得该子进程的状态,否则wait使其调用者阻塞直到一个子进程终止。wait返回终止子进程的进程ID。
这两个函数的参数statloc是一个整型指针。如果statloc不是一个空指针,则终止进程的终止状态就存放在它所指向的单元内。如果不关心终止状态,则可将该参数指定为空指针。
依据传统,这两个函数返回的整型状态字是由实现定义的。其中某些位表示退出状态(正常返回),其他位则指示信号编号(异常返回),有一位指示是否产生一个core文件等。
对于waitpid函数中pid参数的作用解释如下:
pid ==-1 等待任一子进程。就这一方面言,waitpid与wait等效。
pid > 0 等待其进程ID与pid相等的子进程。
pid == 0 等待其组ID等于调用进程组ID的任一子进程。
pid < -1 等待其组ID等于pid绝对值的任一子进程。
waitpid函数返回终止子进程的进程ID,并将该子进程的终止状态存放在由statloc指向的存储单元中。对于wait,其唯一的出错是调用进程没有子进程(函数调用被一个信号中断时,也可能返回另一种出错)。但是对于waitpid,如果指定的进程或进程组不存在,或者参数pid指定的进程不是调用进程的子进程则都将出错。
options参数使我们能进一步控制waitpid的操作。
Constant | Description |
---|---|
WCONTINUED | If the implementation supports job control, the status of any child specified by pid that has been continued after being stopped, but whose status has not yet been reported, is returned (XSI extension to POSIX.1). |
WNOHANG | The waitpid function will not block if a child specified by pid is not immediately available. In this case, the return value is 0. |
WUNTRACED | If the implementation supports job control, the status of any child specified by pid that has stopped, and whose status has not been reported since it has stopped, is returned. The WIFSTOPPED macro determines whether the return value corresponds to a stopped child process. |
waitpid函数提供了wait函数没有提供的三个功能:
waitpid可等待一个特定的进程,而wait则返回任一终止子进程的状态。在讨论popen函数时在说明这一功能。
waitpid提供了一个wait的非阻塞版本。
waitpid支持作业控制。
相关文章推荐
- 进程控制之exit和waitpid(wait)函数
- Linux系统进程控制编程(六)——wait和waitpid函数
- UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid
- 进程控制 [fork() exec() wait() waitpid()]
- 8.6 wait和waitpid函数-进程控制
- 进程环境与进程控制(3): 等待子进程wait/waitpid
- 进程控制之exit和waitpid(wait)函数
- 进程控制-wait()和waitpid()函数
- Linux下C语言开发(进程控制编程——wait()、waitpid())
- 进程控制 [fork() exec() wait() waitpid()]
- 进程控制 [fork() exec() wait() waitpid()]
- UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid
- 第8章(2) 进程控制 -函数wait和waitpid
- 进程控制 [fork() exec() wait() waitpid()]
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- wait() waitpid()信号返回 进程和子进程
- Linux进程控制编程之fork、wait
- UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
- 进程控制:waitpid之status意义解析
- linux进程控制-wait()