歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux僵屍進程詳細解析及ps常見用法

Linux僵屍進程詳細解析及ps常見用法

日期:2017/2/28 16:02:44   编辑:Linux教程

僵屍進程是指的父進程已經退出,而該進程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. const char cmd_init[]="ps -o pid,ppid,state,tty,command";
  6. int main(int argc,char **argv)
  7. {
  8. pid_t pid;
  9. if((pid=fork()) < 0){
  10. exit(-1);
  11. }
  12. else if(pid==0){ /* 父進程exit */
  13. exit(0);
  14. }
  15. sleep(5);
  16. system(cmd_init);
  17. exit(0);
  18. }

後台運行此程序。

./a.out &

Copyright © Linux教程網 All Rights Reserved