wait与waitpid
2016-03-23 14:28
549 查看
1. 函数原型:
(1) statloc是一个整型指针;如果statloc不是一个空指针,则终止进程的终止状态就存放在它指向的单元内;如果不关心终止状态,则可将该参数指定为空指针;
(2) waitpid中的pid参数作用如下:
pid==-1 等待任一子进程。这个waitpid与wait等效; wait(xx) == waitpid(-1, xx, 0);
pid>0 等待进程ID与pid相等的子进程;
pid==0 等待其组ID等于调用进程ID的任一子进程;
pid < -1 等待期组ID等于pid绝对值的任一子进程;
(3) waitpid的options常量:
0-不使用任何选项;
WCONTINUED-若支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但其状态未被报告,则返回其状态;
WNOHANG-若pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时其返回值为0;
WUNTRACED-若某实现支持作业控制,而由pid指定的任一子进程已处于暂停状态,但是其状态自暂停以后还未报告过,则返回其状态;WIFSTOPPED宏确定返回值是否对应一个暂停子进程;
(4) 检查终止状态的宏:
WIFEXITED(status)-若为正常终止子进程返回的状态,则为真;对于这种情况可执行WEXITSTATUS(status),取子进程传送给exit, _exit, _Exit参数的低八位;
WIFSIGNALED(status)-若为异常终止子进程返回的状态,则为真(接到一个不捕捉的信号)。对于这种情况,可执行WTERMSIG(status),获取子进程终止的信号编号;另外有些实现定义宏WCOREDUMP(status),若以产生终止进程的core文件,则返回真;
WIFSTOPPED(status)-若为当前暂停进程的返回状态,则为真;对于这种情况,可执行WSTOPSIG(status),获取使子进程暂停的信号编号;
WIFCONTINUED(status)-若在作业控制暂停后,已经继续的子进程返回了状态,则为真;(仅用于waitpid)
2. wait与waitpid区别:
(1) 在一个进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可以使调用者不阻塞;
(2) waitpid并不等待其调用后的第一个终止子进程,它有若干个选项,可以控制它所等待的子进程;
waitpid提供了wait函数没有的三个功能:
(1) waitpid可以等待一个特定的进程,而wait则返回任一终止子进程的状态;
(2) waitpid提供了一个wait的非阻塞版本。有时用户希望获取一个子进程的状态,但不想阻塞;
(3) waitpid支持作业控制;
3. SIGCHLD信号处理多个子进程:
正确做法:
在多个子进程可能同时终止的时候,同时产生多个SIGCHLD信号,因为信号不排队,所以信号处理函数可能只被调用一次,从而有多个子进程没有wait成为僵尸进程;
所以我们需要在产生信号的时候,对所有结束的子进程进行回收,于是使用while循环;
wait不能使用在while中,因为wait是阻塞的,比如当某子进程一直不停止,它将一直阻塞,从而影响了父进程;
于是使用waitpid,options设置为WNOHANG,可以在非阻塞情况下处理多个退出子进程;
#include <sys/wait.h> pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, int options); ret=成功返回进程ID或者0,失败返回-1
(1) statloc是一个整型指针;如果statloc不是一个空指针,则终止进程的终止状态就存放在它指向的单元内;如果不关心终止状态,则可将该参数指定为空指针;
(2) waitpid中的pid参数作用如下:
pid==-1 等待任一子进程。这个waitpid与wait等效; wait(xx) == waitpid(-1, xx, 0);
pid>0 等待进程ID与pid相等的子进程;
pid==0 等待其组ID等于调用进程ID的任一子进程;
pid < -1 等待期组ID等于pid绝对值的任一子进程;
(3) waitpid的options常量:
0-不使用任何选项;
WCONTINUED-若支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但其状态未被报告,则返回其状态;
WNOHANG-若pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时其返回值为0;
WUNTRACED-若某实现支持作业控制,而由pid指定的任一子进程已处于暂停状态,但是其状态自暂停以后还未报告过,则返回其状态;WIFSTOPPED宏确定返回值是否对应一个暂停子进程;
(4) 检查终止状态的宏:
WIFEXITED(status)-若为正常终止子进程返回的状态,则为真;对于这种情况可执行WEXITSTATUS(status),取子进程传送给exit, _exit, _Exit参数的低八位;
WIFSIGNALED(status)-若为异常终止子进程返回的状态,则为真(接到一个不捕捉的信号)。对于这种情况,可执行WTERMSIG(status),获取子进程终止的信号编号;另外有些实现定义宏WCOREDUMP(status),若以产生终止进程的core文件,则返回真;
WIFSTOPPED(status)-若为当前暂停进程的返回状态,则为真;对于这种情况,可执行WSTOPSIG(status),获取使子进程暂停的信号编号;
WIFCONTINUED(status)-若在作业控制暂停后,已经继续的子进程返回了状态,则为真;(仅用于waitpid)
2. wait与waitpid区别:
(1) 在一个进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可以使调用者不阻塞;
(2) waitpid并不等待其调用后的第一个终止子进程,它有若干个选项,可以控制它所等待的子进程;
waitpid提供了wait函数没有的三个功能:
(1) waitpid可以等待一个特定的进程,而wait则返回任一终止子进程的状态;
(2) waitpid提供了一个wait的非阻塞版本。有时用户希望获取一个子进程的状态,但不想阻塞;
(3) waitpid支持作业控制;
3. SIGCHLD信号处理多个子进程:
正确做法:
void sig_child(int signo) { pid_t pid; int stat; while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) printf("child %d terminated\n", pid); return; }
在多个子进程可能同时终止的时候,同时产生多个SIGCHLD信号,因为信号不排队,所以信号处理函数可能只被调用一次,从而有多个子进程没有wait成为僵尸进程;
所以我们需要在产生信号的时候,对所有结束的子进程进行回收,于是使用while循环;
wait不能使用在while中,因为wait是阻塞的,比如当某子进程一直不停止,它将一直阻塞,从而影响了父进程;
于是使用waitpid,options设置为WNOHANG,可以在非阻塞情况下处理多个退出子进程;
相关文章推荐
- 【技术向】rainmeter的设计与发现
- shiro配置filterchaindefinitions实现多角色判定方法的重写
- Invalid file name: must contain only [a-z0-9_.]
- Groovy DSL (1) Command chains
- pair 函数 (STL)
- 记一次foxmailQQ邮箱创建失败到解决方法
- 微软AI首席科学家:AlphaGo激发全球人工智能进入新时代
- 自动释放池工作原理,self = [super init]和定义属性时,什么时候用 assign、retain、copy 以及它们的之间的区别?
- 常用修图工具的一些使用技巧及问题解决方法——ai
- 菜鸟学算法之 POJ 3007 Organize Your Train part II
- leetcode 217. Contains Duplicate
- res\HTTPFilter.manifest : general error c1010070: Failed to load and parse the manifest. {_~
- retain/assign/strong/weak/copy/mutablecopy/autorelease区别
- hdoj A + B Again 2057 (16进制加法)
- your local repository contains non-ascii
- 迷信again
- 219. Contains Duplicate II
- 217. Contains Duplicate
- int main(int argc, char *argv[])的含义
- 成都某公司HP服务器双循环系统无法启动的RAID5数据恢复