手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux僵尸进程详细解析及ps常见用法

[日期:2011-11-25] 来源:Linux社区  作者:NowDoIT [字体: ]

     僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程
怎样产生僵尸进程的:

     一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是 为什么系统中有时会有很多的僵尸进程。

    由此看出,僵尸进程并不会佔用很多的资源。唯一的危害是影响了系统最大进程数。

如何查看僵尸进程?

ps auwx;发现僵尸进程的状态为Z。

ps axf;看进程数,以树的方式。

ps auwx | cut -c 10-15,45-50,63- | grep -i Z 查看僵尸进程pid、名称和进程路径。

应用实例:

  1. #include <unistd.h>   
  2. #include <stdlib.h>   
  3. #include <stdio.h>   
  4. #include <sys/wait.h>   
  5.   
  6. const char cmd_init[]="ps -o pid,ppid,state,tty,command";  
  7.   
  8. int main(int argc,char **argv)  
  9. {  
  10.         pid_t   pid;  
  11.   
  12.         if((pid=fork()) < 0){  
  13.                 exit(-1);  
  14.         }  
  15.         else if(pid==0){  /* 父进程exit */  
  16.                 exit(0);  
  17.         }  
  18.   
  19.         sleep(5);  
  20.         system(cmd_init);  
  21.   
  22.         exit(0);  
  23. }  

后台运行此程序。

./a.out &

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款