歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 系統中僵屍進程

Linux 系統中僵屍進程

日期:2017/2/28 14:42:54   编辑:Linux教程

Linux 系統中僵屍進程和現實中僵屍(雖然我也沒見過)類似,雖然已經死了,但是由於沒人給它們收屍,還能四處走動。僵屍進程指的是那些雖然已經終止的進程,但仍然保留一些信息,等待其父進程為其收屍。


僵屍進程如何產生的?
如果一個進程在其終止的時候,自己就回收所有分配給它的資源,系統就不會產生所謂的僵屍進程了。那麼我們說一個進程終止之後,還保留哪些信息?為什麼終止之後還需要保留這些信息呢?

一個進程終止的方法很多,進程終止後有些信息對於父進程和內核還是很有用的,例如進程的ID號、進程的退出狀態、進程運行的CPU時間等。因此進程在終止時,回收所有內核分配給它的內存、關閉它打開的所有文件等等,但是還會保留以上極少的信息,以供父進程使用。父進程可以使用 wait/waitpid 等系統調用來為子進程收拾,做一些收尾工作。

因此,一個僵屍進程產生的過程是:父進程調用fork創建子進程後,子進程運行直至其終止,它立即從內存中移除,但進程描述符仍然保留在內存中(進程描述符占有極少的內存空間)。子進程的狀態變成EXIT_ZOMBIE,並且向父進程發送SIGCHLD 信號,父進程此時應該調用 wait() 系統調用來獲取子進程的退出狀態以及其它的信息。在 wait 調用之後,僵屍進程就完全從內存中移除。因此一個僵屍存在於其終止到父進程調用 wait 等函數這個時間的間隙,一般很快就消失,但如果編程不合理,父進程從不調用 wait 等系統調用來收集僵屍進程,那麼這些進程會一直存在內存中。

在 Linux 下,我們可以使用 ps 等命令查看系統中僵屍進程,僵屍進程的狀態標記為‘Z’:


產生一個僵屍進程
根據上面的描述,我們很容易去寫一個程序來產生僵屍進程,如下代碼:

#include <stdio.h>
#include <sys/types.h>

int main()
{
//fork a child process
pid_t pid = fork();

if (pid > 0) //parent process
{
printf("in parent process, sleep for one miniute...zZ...\n");
sleep(60);
printf("after sleeping, and exit!\n");
}
else if (pid == 0)
{
//child process exit, and to be a zombie process
printf("in child process, and exit!\n");
exit(0);
}

return 0;
}
父進程並沒有寫 wait 等系統調用函數,因此在子進程退出之後變成僵屍進程,父進程並沒有為其去收屍。我們使用下面命令編譯運行該進程,然後查看系統中進程狀態:

www.linuxidc.com @linuxidc:~/Documents$ gcc zombie.c -o zombie
www.linuxidc.com @linuxidc:~/Documents$ ./zombie
in parent process, sleep for one miniute...zZ...
in child process, and exit!

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-10/91567p2.htm

Copyright © Linux教程網 All Rights Reserved