织梦CMS - 轻松建站从此开始!

罗索

再谈僵尸进程

jackyhwei 发布于 2011-09-22 09:21 点击:次 
昨天,好好看了看有僵尸进程模块的代码,发现调用POPEN后还是有PCLOSE关掉的,可为什么还有那个SHELL"僵尸"掉呢,实在搞不懂,今晚,做是实验
TAG:

昨天,好好看了看有僵尸进程模块的代码,发现调用POPEN后还是有PCLOSE关掉的,可为什么还有那个SHELL"僵尸"掉呢,实在搞不懂,今晚,做是实验:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <signal.h> 
  4. #include <sys/time.h> 
  5.  
  6. void set_STIMER(int s1) { 
  7.     struct itimerval value1; 
  8.     if (s1 > 0) { 
  9.         value1.it_value.tv_sec = s1; 
  10.         value1.it_value.tv_usec = 0; 
  11.         value1.it_interval = value1.it_value; 
  12.     } else { 
  13.         value1.it_value.tv_sec = (0 * 1000); 
  14.         value1.it_value.tv_usec = 0; 
  15.         value1.it_interval = value1.it_value; 
  16.     } 
  17.  
  18.     setitimer(ITIMER_REAL, &value1, NULL); 
  19.  
  20. void use_popen () 
  21.  FILE * pFile; 
  22.  char * buffer; 
  23.  size_t result; 
  24.  
  25.  pFile = popen ( "date" , "r" ); 
  26.  if (pFile==NULL) 
  27.  { 
  28.   fputs ("File error",stderr); 
  29.   exit (1); 
  30.  } 
  31.  
  32.  buffer = (char*) malloc (1024); 
  33.  if (buffer == NULL) 
  34.  { 
  35.   fputs ("Memory error",stderr); 
  36.   exit (2); 
  37.  } 
  38.  
  39.   fread (buffer,sizeof(char),256,pFile); 
  40.   printf("%s/n",buffer); 
  41.  
  42.  // fclose (pFile);//注:没有PCLOSE 
  43.   free (buffer); 
  44. void init_sigaction() 
  45.  struct sigaction act; 
  46.  act.sa_handler=use_popen; 
  47.  act.sa_flags=0; 
  48.  sigemptyset(&act.sa_mask); 
  49.  sigaction(SIGALRM, &act, NULL); 
  50.  
  51. int main(int argc, char *argv[]) 
  52. {
  53.  init_sigaction(); 
  54.  set_STIMER(5); 
  55.  
  56.  while (1) 
  57.  { 
  58.  system("exec ps"); 
  59.  sleep (10); 
  60.  } 
  61.  return 0; 

运行结果:

四  9月 18 19:02:07 CST 2008

  PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3341 pts/0    00:00:00 z
 3345 pts/0    00:00:00 date <defunct>
 3349 pts/0    00:00:00 date <defunct>
 3353 pts/0    00:00:00 date <defunct>
 3357 pts/0    00:00:00 date <defunct>
 3361 pts/0    00:00:00 date <defunct>
 3365 pts/0    00:00:00 date <defunct>
 3369 pts/0    00:00:00 date <defunct>
 3373 pts/0    00:00:00 date <defunct>
 3374 pts/0    00:00:00 ps
四  9月 18 19:02:12 CST 2008

  PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3341 pts/0    00:00:00 z
 3345 pts/0    00:00:00 date <defunct>
 3349 pts/0    00:00:00 date <defunct>
 3353 pts/0    00:00:00 date <defunct>
 3357 pts/0    00:00:00 date <defunct>
 3361 pts/0    00:00:00 date <defunct>
 3365 pts/0    00:00:00 date <defunct>
 3369 pts/0    00:00:00 date <defunct>
 3373 pts/0    00:00:00 date <defunct>
 3377 pts/0    00:00:00 date <defunct>
 3378 pts/0    00:00:00 ps
四  9月 18 19:02:17 CST 2008

  PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3341 pts/0    00:00:00 z
 3345 pts/0    00:00:00 date <defunct>
 3349 pts/0    00:00:00 date <defunct>
 3353 pts/0    00:00:00 date <defunct>
 3357 pts/0    00:00:00 date <defunct>
 3361 pts/0    00:00:00 date <defunct>
 3365 pts/0    00:00:00 date <defunct>
 3369 pts/0    00:00:00 date <defunct>
 3373 pts/0    00:00:00 date <defunct>
 3377 pts/0    00:00:00 date <defunct>
 3381 pts/0    00:00:00 date <defunct>
 3382 pts/0    00:00:00 ps
四  9月 18 19:02:22 CST 2008

  PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3341 pts/0    00:00:00 z
 3345 pts/0    00:00:00 date <defunct>
 3349 pts/0    00:00:00 date <defunct>
 3353 pts/0    00:00:00 date <defunct>
 3357 pts/0    00:00:00 date <defunct>
 3361 pts/0    00:00:00 date <defunct>
 3365 pts/0    00:00:00 date <defunct>
 3369 pts/0    00:00:00 date <defunct>
 3373 pts/0    00:00:00 date <defunct>
 3377 pts/0    00:00:00 date <defunct>
 3381 pts/0    00:00:00 date <defunct>
 3385 pts/0    00:00:00 date <defunct>
 3386 pts/0    00:00:00 ps
四  9月 18 19:02:27 CST 2008

  PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3341 pts/0    00:00:00 z
 3345 pts/0    00:00:00 date <defunct>
 3349 pts/0    00:00:00 date <defunct>
 3353 pts/0    00:00:00 date <defunct>
 3357 pts/0    00:00:00 date <defunct>
 3361 pts/0    00:00:00 date <defunct>
 3365 pts/0    00:00:00 date <defunct>
 3369 pts/0    00:00:00 date <defunct>
 3373 pts/0    00:00:00 date <defunct>
 3377 pts/0    00:00:00 date <defunct>
 3381 pts/0    00:00:00 date <defunct>
 3385 pts/0    00:00:00 date <defunct>
 3389 pts/0    00:00:00 date <defunct>
 3390 pts/0    00:00:00 ps
很明显,有僵尸进程产生

用FCLOSE关掉POPEN 打开的文件

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <signal.h> 
  4. #include <sys/time.h> 
  5.  
  6. void set_STIMER(int s1) { 
  7.     struct itimerval value1; 
  8.  
  9.     if (s1 > 0) { 
  10.         value1.it_value.tv_sec = s1; 
  11.         value1.it_value.tv_usec = 0; 
  12.         value1.it_interval = value1.it_value; 
  13.     } else { 
  14.         value1.it_value.tv_sec = (0 * 1000); 
  15.         value1.it_value.tv_usec = 0; 
  16.         value1.it_interval = value1.it_value; 
  17.     } 
  18.     setitimer(ITIMER_REAL, &value1, NULL); 
  19.  
  20. void use_popen () 
  21.  FILE * pFile; 
  22.  char * buffer; 
  23.  size_t result; 
  24.  
  25.  pFile = popen ( "date" , "r" ); 
  26.  if (pFile==NULL) 
  27.  { 
  28.   fputs ("File error",stderr); 
  29.   exit (1); 
  30.  } 
  31.  
  32.  buffer = (char*) malloc (1024); 
  33.  if (buffer == NULL) 
  34.  { 
  35.   fputs ("Memory error",stderr); 
  36.   exit (2); 
  37.  } 
  38.  
  39.   fread (buffer,sizeof(char),256,pFile); 
  40.   printf("%s/n",buffer); 
  41.  
  42.   fclose (pFile); 
  43.   free (buffer); 
  44. void init_sigaction() 
  45.  struct sigaction act; 
  46.  act.sa_handler=use_popen; 
  47.  act.sa_flags=0; 
  48.  sigemptyset(&act.sa_mask); 
  49.  sigaction(SIGALRM, &act, NULL); 
  50.  
  51. int main(int argc, char *argv[]) 
  52.  init_sigaction(); 
  53.  set_STIMER(5); 
  54.  
  55.  while (1) 
  56.  { 
  57.  system("exec ps"); 
  58.  sleep (10); 
  59.  } 
  60.  return 0; 

[root@lanhai-linux popen]#   PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3429 pts/0    00:00:00 p
 3430 pts/0    00:00:00 ps
四  9月 18 19:02:58 CST 2008

  PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3429 pts/0    00:00:00 p
 3432 pts/0    00:00:00 ps

没有僵尸进程产生

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <signal.h> 
  4. #include <sys/time.h> 
  5. #include <sys/types.h> 
  6. #include <sys/wait.h> 
  7.  
  8. void set_STIMER(int s1) { 
  9.     struct itimerval value1; 
  10.  
  11.     if (s1 > 0) { 
  12.         value1.it_value.tv_sec = s1; 
  13.         value1.it_value.tv_usec = 0; 
  14.         value1.it_interval = value1.it_value; 
  15.     } else { 
  16.         value1.it_value.tv_sec = (0 * 1000); 
  17.         value1.it_value.tv_usec = 0; 
  18.         value1.it_interval = value1.it_value; 
  19.     } 
  20.  
  21.     setitimer(ITIMER_REAL, &value1, NULL); 
  22.  
  23.  
  24. void use_popen () 
  25.  
  26.  FILE * pFile; 
  27.  char * buffer; 
  28.  size_t result; 
  29.  
  30.  pFile = popen ( "date" , "r" ); 
  31.  if (pFile==NULL) 
  32.  
  33.  { 
  34.  
  35.   fputs ("File error",stderr); 
  36.  
  37.   exit (1); 
  38.  
  39.  } 
  40.  
  41.  buffer = (char*) malloc (1024); 
  42.  if (buffer == NULL) 
  43.  
  44.  { 
  45.  
  46.   fputs ("Memory error",stderr); 
  47.  
  48.   exit (2); 
  49.  
  50.  } 
  51.  
  52.   fread (buffer,sizeof(char),256,pFile); 
  53.   printf("%s/n",buffer); 
  54.  
  55.  // fclose (pFile); 
  56.   free (buffer); 
  57. void init_sigaction() 
  58.  struct sigaction act; 
  59.  act.sa_handler=use_popen; 
  60.  act.sa_flags=0; 
  61.  sigemptyset(&act.sa_mask); 
  62.  sigaction(SIGALRM, &act, NULL); 
  63. void process_zombie() 
  64. {     
  65.  pid_t   pid; 
  66.  int   stat; 
  67.  while((pid = waitpid(-1, &stat, WNOHANG)) > 0); 
  68.  return
  69. // 
  70. void init_sigaction2() 
  71.  struct sigaction act; 
  72.  act.sa_handler=process_zombie; 
  73.  act.sa_flags=0; 
  74.  sigemptyset(&act.sa_mask); 
  75.  sigaction(SIGCHLD, &act, NULL); 
  76.  
  77.  
  78. int main(int argc, char *argv[]) 
  79.  
  80.  
  81.  init_sigaction(); 
  82.  set_STIMER(5); 
  83.  init_sigaction2(); 
  84.  
  85.   
  86.  
  87.  while (1) 
  88.  { 
  89.  system("exec ps"); 
  90.  sleep (10); 
  91.  } 
  92.  return 0; 

  PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3493 pts/0    00:00:00 pz
 3506 pts/0    00:00:00 ps
四  9月 18 19:04:36 CST 2008

  PID TTY          TIME CMD
 3278 pts/0    00:00:00 bash
 3493 pts/0    00:00:00 pz
 3508 pts/0    00:00:00 ps
也没有产生僵尸进程

 

对于那个用WAITPID才能"收拾"掉的"[sh]"产生的原因.还是不详!!!!!!!

(yufangbo)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201109/15031.html]
本文出处:blog.csdn.net/yufangbo 作者:yufangbo
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容