waitpid函数详解
上一篇 / 下一篇 2008-12-21 16:01:41 / 个人分类:Lunix 点滴
- 文件版本: V1.0
- 开发商: 本站原创
- 文件来源: 本地
- 界面语言: 简体中文
- 授权方式: 免费
- 运行平台: Win9X/Win2000/WinXP
K X'W3fW`Q(j0【waitpid系统调用】
4DMn{X0 功能描述:
1t0D@[;|)i0 等待进程改变其状态。所有下面哪些调用都被用于等待子进程状态的改变,获取状态已改变的子进程信息。状态改变可被认为是:1.子进程已终止。2.信号导致子进程停止执行。3.信号恢复子进程的执行。在子进程终止的情况下,wait调用将允许系统释放与子进程关联的资源。如果不执行wait,终止了的子进程会停留在"zombie"状态。51Testing软件测试网Pk0c3A k4~L1|G)kV"c
如果发现子进程改变了状态,这些调用会立即返回。反之,调用会被阻塞直到子进程状态改变,或者由信号处理句柄所中断(假如系统调用没有通过sigaction的SA_RESTART标志重启动)。
E eL\(l*v:S-~E051Testing软件测试网YA[l"Xe.q wait系统调用挂起当前执行中的进程,直到它的一个子进程终止。waitpid挂起当前进程的执行,直到指定的子进程状态发生变化。默认,waitpid只等待终止状态的子进程,但这种行为可通过选项来改变。waitid系统调用对于等待哪个子进程状态改变提供了更精确的控制。
ya0aE~CDu-Z*y0
NX([5](g&@x)@(HH0 子进程已终止,父进程尚未对其执行wait操作,子进程会转入“僵死”状态。内核为“僵死”状态的进程保留最少的信息量(进程标识,终止状态,资源使用信息),过后父进程执行wait时可以获取子进程信息。只要僵死的进程不通过wait从系统中移去,它将会占据内核进程表中的一个栏位。如果进程表被填满,内核将不能再产生新进程。如果父进程已终止,它的僵死子进程将由init进程收养,并自动执行wait将它们移去。51Testing软件测试网s{p^TK?(wy?c
51Testing软件测试网nn)s4l&kZ
用法: 51Testing软件测试网{Rc3BUW)j.A}
#include <sys/types.h>
r$KNl
]y,s8O+D0#include <sys/wait.h>
pid_t wait(int *status);
vIaWN5[9A0pid_t waitpid(pid_t pid, int *status, int options);
U(\&Dr1si`]0Hn0int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
51Testing软件测试网;~,a;Dy U!Tk
参数:
|"Nh)o}!Ss0pid:可能值有以下51Testing软件测试网4gC/ae5cjF
A/a"kC&xe0小于-1 //意味着等待所有其进程组标识等于pid绝对值的子进程。
M/?Z&L e+Sp0 -1 //意味着等待任何子进程。51Testing软件测试网YW&S(I9x
0 //意味着等待任何其组标识等于调用进程组标识的进程。51Testing软件测试网5a1y(V6M PcO DA
大于0 //意味着等待其进程标识等于pid的进程。
7j6w.toy0status:指向子进程的返回状态,可通过以下宏进行检索
I G0pb8jGu0`%B'G ojCY0WIFEXITED(status) //返回真如果子进程正常终止,例如:通过调用exit(),_exit(),或者从main()的return语句返回。
&l%^)m X6u
d8O'L0WEXITSTATUS(status) //返回子进程的退出状态。这应来自子进程调用exit()或_exit()时指定的参数,或者来自main内部return语句参数的最低字节。只有WIFEXITED返回真时,才应该使用。51Testing软件测试网kM|({g&NH
WIFSIGNALED(status) //返回真如果子进程由信号所终止51Testing软件测试网Lf[ V x
WTERMSIG(status) //返回导致子进程终止的信号数量。只有WIFSIGNALED返回真时,才应该使用。
R&An#_
?y3b!t _o.q.u0WCOREDUMP(status) //返回真如果子进程导致内核转存。只有WIFSIGNALED返回真时,才应该使用。并非所有平台都支持这个宏,使用时应放在#ifdef WCOREDUMP ... #endif内部。
U}+~
hY+L
|0WIFSTOPPED(status) //返回真如果信号导致子进程停止执行。
8h p|-N+yO*~0WSTOPSIG(status) //返回导致子进程停止执行的信号数量。只有WIFSTOPPED返回真时,才应该使用。51Testing软件测试网U'g;CL og
WIFCONTINUED(status) //返回真如果信号导致子进程继续执行。
options:可以是0个或多个以下符号常量通过or运算的组合体51Testing软件测试网6Sld\-V|
5IMv
]7rbDV4N0WNOHANG //如果没有子进程退出,立即返回51Testing软件测试网.C_aG]+]wmZ!U
WUNTRACED //如果有处于停止状态的进程将导致调用返回。
'AZ3pr-a(kg*bo0WCONTINUED //如果停止了的进程由于SIGCONT信号的到来而继续运行,调用将返回。
下面是Linux特有的选项,不能用于waitid
%L4o$A*qxn2K7]0__WCLONE //只等待"clone"的子进程。一个"clone" 进程即是终止时不会给父进程发送信号,或者不会给父进程发送SIGCHLD信号的进程。51Testing软件测试网srYO2WMf'b
__WALL //等待所有类型的子进程,包括"clone"和"non-clone"。
b{Tmw-}G0__WNOTHREAD //不会等待同一线程组的其它线程的子孙。51Testing软件测试网1E3aa-hEd}
WUNTRACED 和 WCONTINUED 只有在SIGCHLD信号没有设置SA_NOCLDSTOP标志时才起作用。51Testing软件测试网6ri3| mw9ZN0vDdR
"g&pR3K4d0idtype,id:这两个参数结合在一起指出应选择等待哪些子进程,可能情况有51Testing软件测试网Ap2jw-r q;o
51Testing软件测试网0a\,V'n:wlE7L.K | @didtype == P_PID //等待进程标识与id匹配的子进程。
M2d"ns5H@0idtype == P_PGID //等待进程组标识与id匹配的任何子进程。51Testing软件测试网-]qoX4Ol e J
idtype == P_ALL //等待任何子进程,id无作用51Testing软件测试网#VML's7_ V8rXz
可在options参数中指定的感兴趣的子进程状态改变标志有以下常量,可以通过or运算加以组合51Testing软件测试网+[)I CZ,JPZ#x$r_
51Testing软件测试网bT8[@,KWEXITED //等待已终止的子进程。51Testing软件测试网 P4iV1iFS_-^5P6J
WSTOPPED //等待由于信号已停止执行的子进程。
G3SL7F9B*r.[P0WCONTINUED //等待由于信号已恢复执行的子进程。
P%W1Px%[l\,[;w0WNOHANG //作用如同waitpid。
X5C-f5}qK*B0WNOWAIT //保留子进程的可等待状态,后面的wait调用可再次获取子进程的状态信息。
kU@gY8y0infop:成功执行返回时,waitid将填充infop所指向结构体的如下字段
9ip6@;Tu:J:Drm0._"YfZ+[O.jtm5y0si_pid //子进程标识。51Testing软件测试网8K!M&{&dz`$a/c
si_uid //子进程的真实用户标识。51Testing软件测试网AMI$tZ fc ]7T
si_signo //总被设置为SIGCHLD。51Testing软件测试网T*e3b\ ob
si_status //子进程的退出状态,或者导致子进程退出,停止执行或恢复执行的信号,需要根据si_code字段来解释。51Testing软件测试网~8B%u4v)G[ U
si_code //可能值有CLD_EXITED(子进程调用_exit退出), CLD_KILLED(子进程被信号杀死),CLD_STOPPED(信号导致子进程停止执行),CLD_CONTINUED(信号恢复子进程继续执行)。51Testing软件测试网b/N'c\S
V"C
.q ~/Z$K3O?/KnG0返回说明: 51Testing软件测试网d'w#z'I~3K{k
wait():成功执行时,返回终止子进程的标识。失败返回-1;
__^]UW$[? qA0waitpid():成功执行时,返回状态改变的子进程标识。失败返回-1;如果指定WNOHANG标志,同时pid指定的进程状态没有发生变化,将返回0。51Testing软件测试网0C}x,F%t:P
waitid():成功执行或者WNOHANG标志被设置而id指定的子进程状态没有发生变化时返回0。失败返回-1。51Testing软件测试网 lW/h(\b
WX
]}7g%v&G0出错值可能有下面这些
-q1d
OG| fP'DOd0ECHILD:参数指定的进程不存在,或者并非调用进程的子进程
fz5r{
}wI1S0EINTR;WNOHANG不被设置,同时捕捉到一个不被阻塞的信号或SIGCHLD信号
r"yyk1Mw0EINVAL:options参数无效
例子:51Testing软件测试网/[:BC$KPf7h8I6[f6E^
(l
jv4WhE*`C0$ ./a.out &
f.OI9F0RCkw0Child PID is 3236051Testing软件测试网F7e'@&io\*u:Ee+T
[1] 32359
Vu7y1eJh^2{%B0$ kill -STOP 32360
/@y*bm
Yw0stopped by signal 19
3DZC%P3E0$ kill -CONT 3236051Testing软件测试网5ojs`
p
continued51Testing软件测试网
rXs0\6UOk,}
$ kill -TERM 3236051Testing软件测试网[5xG#M#u(m8Vc
killed by signal 1551Testing软件测试网xq/mv7As@
[1]+ Done ./a.out51Testing软件测试网(fQOh{ X3Z
K
$
#include <sys/wait.h>51Testing软件测试网6aj6i _M"]-I5Ki:p
#include <stdlib.h>51Testing软件测试网eY
^TCp
#include <unistd.h>51Testing软件测试网6bp-UV\8eE3_
#include <stdio.h>
/P*t;y]ei*^-@){0int main(int argc, char *argv[])51Testing软件测试网t|R3i1q6F
{
_:jKg\\0 pid_t cpid, w;
hC wur:poU0 int status;51Testing软件测试网Mq)XyJ }UgwW
cpid = fork();
fK%x$G)B0 if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }