wait、waitpid函数
2014-05-01 22:25
387 查看
当一个进程正常或异常终止,内核向其父进程发送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)
{
int status;
if(fork() == 0)
exit(7);
wait(&status);
pr_exit(status);
if(fork() == 0)
abort(); //generates SIGABRT
wait(&status);
pr_exit(status);
if(fork() == 0)
status /= 0; //divide by 0 generates SIGFPE
wait(&status);
pr_exit(status);
exit(0);
}
output:
normal termination, exit status = 7
abnormal termination, signal number = 6
abnormal termination, signal number = 8
进程在收到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)
{
int status;
if(fork() == 0)
exit(7);
wait(&status);
pr_exit(status);
if(fork() == 0)
abort(); //generates SIGABRT
wait(&status);
pr_exit(status);
if(fork() == 0)
status /= 0; //divide by 0 generates SIGFPE
wait(&status);
pr_exit(status);
exit(0);
}
output:
normal termination, exit status = 7
abnormal termination, signal number = 6
abnormal termination, signal number = 8
相关文章推荐
- wait和waitpid函数
- Linux signal, wait, waitpid 函数
- 6进程原语:wait()和waitpid()函数
- UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
- wait和waitpid函数详解
- wait/waitpid函数使用
- 函数wait与waitpid的使用
- 进程控制-wait()和waitpid()函数
- 深入探讨:unix多进程编程之wait()与waitpid()函数
- 详解wait和waitpid函数
- 网络编程(12)—— 利用wait和waitpid函数消毁僵尸进程
- linux c之wait和waitpid函数的用法和总结
- 进程控制之exit和waitpid(wait)函数
- Linux多任务编程(五)---wait()、waitpid()函数及其基础实验
- 详解wait和waitpid函数
- Linux系统wait()和waitpid()函数
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- 深入探讨:unix多进程编程之wait()与waitpid()函数
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- linux wait与waitpid函数的深入分析