感谢支持
我们一直在努力

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

     僵尸进程是指的父进程已经退出,而该进程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 &

赞(0) 打赏
转载请注明出处:服务器评测 » Linux僵尸进程详细解析及ps常见用法
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏