一个进程终止但是父进程尚未进行回收,就是僵死。5 ]: W0 G" _- J& S) q, o' d
避免僵死可以调用waitpid等待子进程结束,但是其间父进程一直阻塞。
* Q6 P7 |8 k/ ?" R2 h 更好的办法是调用两次fork函数。! x2 n$ I' O' ^& T4 E0 z
源代码如下:
; O; |! K+ g/ b+ n' _ U: l- A #include7 h5 E/ p0 N; r& X: n
#include; Z, K' r3 b" r- j
#include) L: I w2 N9 C* T# v2 y% ^5 g
int main()
- n4 p7 a/ |- s {. Q" i! T. @" E! j
pid_t pid;
$ J4 m! ~/ b$ }. ~ if((pid = fork()) < 0)//出错
* V/ I) Y% z3 O {
( W1 T8 O4 V/ p. v perror("fork!\n");1 ]; w* o; b% U4 ^; M' ~9 O' K
}
3 ~3 G+ v$ \' E7 [7 J( q else if(pid == 0)//子进程1
4 K* `/ M2 o2 E {//子进程中创建进程2
, \% _' `- Q8 M! p g, G* l6 }8 _ if((pid =fork()) < 0)//出错
" t" o4 }9 T7 F5 d {
# Q5 M9 U( j3 T& ~" C, m# j3 V perror("fork!\n");
( p7 W: I x# | }% i; T, r8 y: h6 i
else if(pid > 0)//进程1# v9 V/ S6 C/ ?5 o; O; t* O
{
4 j( y0 P+ O0 B- ?# i exit(0);//退出4 B6 j* n. d; \: g2 X
}+ b+ k# `3 q! w5 o7 P, l
else//子进程2
9 J4 \- f9 E/ i' C {
( Y, d3 d# Y5 ~4 [ sleep(2);
( i6 E$ i y8 ^6 y" t printf("second child, parent pid = %d\n", getpid());# W. u; f1 m! S n
exit(0);
' L+ V- _5 r! b }1 K# t6 h) \7 W$ {: g2 Q
}! Y" m( [& H% r& I+ k4 E
else//父进程
9 H/ m, k! x/ Z: j7 p5 c( o {3 H3 l5 a$ A# I! I6 E6 F& b
sleep(3);
, Y/ \8 K/ ~7 D- R3 G1 ] printf("parent!\n");6 i) O; R# K- S- e/ O
exit(0);
1 _# m/ \. F k }
* R& l/ F/ j* r7 T' V9 A } |