wait、waitpid函数
来源:互联网 发布:买家淘宝退货流程图 编辑:程序博客网 时间:2024/06/03 21:22
当一个进程正常或异常终止,内核向其父进程发送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){intstatus;if(fork() == 0)exit(7);wait(&status);pr_exit(status);if(fork() == 0)abort();//generates SIGABRTwait(&status);pr_exit(status);if(fork() == 0)status /= 0;//divide by 0 generates SIGFPEwait(&status);pr_exit(status);exit(0);}
output:
normal termination, exit status = 7
abnormal termination, signal number = 6
abnormal termination, signal number = 8
- wait()函数,waitpid()函数
- wait 和waitpid函数
- wait和waitpid函数
- wait() 和waitpid() 函数
- wait() waitpid()函数
- wait和waitpid函数
- wait和waitpid函数
- wait和waitpid函数
- wait和waitpid函数
- wait、waitpid函数
- wait()和waitpid()函数
- 函数wait和waitpid
- wait/waitpid函数使用
- wait和waitpid函数
- wait和waitpid函数
- wait和waitpid函数
- wait和waitpid函数
- wait waitpid函数使用
- windows phone 7 页面间跳转方法
- jquery.validate自定义验证--成功提示与择要提示
- ipconfig vs2010 C+++
- CAS在tomcat6.0.18下的SSO
- C/C++数组名与指针区别
- wait、waitpid函数
- JAVA之IO技术文件的复制原理。
- cocos2d-x 两个场景间进行传参数
- python文件调用另一个python class文件中的方法
- IT行业学习之谈
- 技能冷却图标实现(原理篇)
- C# 网络编程之通过豆瓣API获取书籍信息
- 技能冷却图标实现(实践篇-MeshFilter and Mesh)
- auto_ptr