|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
wait()和waitpid()
! u1 o0 g1 ]5 j( y6 a1 _8 `% C) S' z$ g$ w( E3 x
函数说明* [1 b- |% | j* z
/ k/ B) y% {$ \# l- F& Y wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。
% g* ?# b3 u/ c1 Z8 ] j
5 \& o9 b. ]/ N. u0 q9 v* T waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程(它可以指定需要等待终止的子进程),它还有若干选项,如可提供一个非阻塞版本的 wait()功能,也能支持作业控制。实际上,wait()函数只是 waitpid()函数的一个特例,在Linux 内部实现 wait()函数时直接调用的就是waitpid()函数。
: [ M! T5 S* a4 K- T. V
* Q5 S' B4 P/ k+ f& ]函数格式
) ^ b) g1 A1 H' Z6 ?. T
5 Y; _7 m. p/ r$ _4 s, w 下图为wait()函数的格式# w5 Z' y0 M Y9 U# W E8 x* w9 q
! ]: h9 H% Y0 K8 b" ]% [
& z& ?. f# I9 _! [$ {& m
p6 X1 x+ B/ {& v2 T; f
下图为waitpid()函数的格式
$ q- G+ N- {" b! z9 K7 z% d: p; x8 b/ X
* \" o2 c/ c# H
8 \: s# n. c* s4 s# E7 Q8 `% s: m% Q2 h, }( l
$ c& |0 e8 l/ l9 D$ V9 E/ N
基础实验
/ x6 T A- `7 o9 X9 S. y- i
5 a+ ?5 R( r# T% U7 P实验1! Q( K' k7 I/ f6 f
9 C- Q7 T8 d9 ] 本实验中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG是该父进程不会阻塞。若有子进程退出,则waitpid()返回子进程号;若没有子进程退出,则waitpid()返回0,并且父进程每隔1s循环判断一次。该程序的流程图如下:
0 `0 ?" |4 x( u/ Q3 }; i4 h$ a
9 |. T- f- B, o1 O) a6 R) q5 z5 \, w* e* R" K( _
0 L# R6 z, N5 l1 K% d( I- A0 c5 q" {1 |0 h( U2 N/ `
4 n) k; S! o" I5 W# g5 r+ Y
|
|