a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 64|回复: 0

[LPI认证] Linux认证:系统进程僵死的避免

[复制链接]
发表于 2012-8-4 12:13:19 | 显示全部楼层 |阅读模式
一个进程终止但是父进程尚未进行回收,就是僵死。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  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 19:19 , Processed in 0.192390 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表