Linux的僵尸进程
僵尸進程的簡單理解
linux中有幾種進程狀態,其中有一種特殊就是僵尸進程,個人理解是可以這樣理解,就是我們 的子進程已經退出了,但是子進程退出了之后無家可歸,就是一個飄移的孤魂野鬼一樣,所以形象的取名字叫做僵尸進程。
僵尸進程的結構
其實僵尸進程識一個進程調用exit退出之后留下的一個數據結構。處于僵尸狀態的進程,幾乎沒有內存空間,沒有可以執行的代碼,也不能被系統調度,他在進程列表中保留了一個位置,用來記錄該進程的退出狀態。
保留僵尸進程的原因
我們不得不反問,一個進程退出了之后,為什么還要處于僵尸進程一段時間呢
一個進程雖然退出了,但是該進程還保留了很多對于程序員或者系統管理員來說有用 的信息。比如,該進程識如何退出的,是正常退出,還是出現了錯誤,還是被其他進程結束掉,總結來說這個進程的退出碼是什么;這個進程占用的CPU時間還有用戶時間是多少。
這些信息都被存儲在僵尸進程中,可以這樣理解,比如一個東東如果莫名其妙的死了,我們總得知道這個東東的尸體在哪里,它是怎么死掉的。
所以進程退出后,系統會把它變成Zombie,然后等待其父進程來回收它。父進程可能正在做其他事情,來不及回收,如果父進程一直不回收,那么該進程在一段時間后就會被系統內核回收掉。
創建一個僵尸進程
下面提供了一段創建僵尸進程的例子
#include<stdio.h>#include<stdlib.h>int main(){int id = fork();if(id > 0){printf("Parent is sleeping....\n");sleep(5);}if(id == 0){printf("son exit");exit(EXIT_SUCCESS);}return 0;}
程序執行的結果是,首先打印出了Parent is sleeping….,然后另換一行打印出son exit,接著持續了5秒鐘之后程序退出。
我們在執行上面的程序的時候,我們可以再后天進行監視,直接輸入指令ps -ax,然后會發現一個進程是僵尸進程,顯示如下
2653 pts/0 Z+ 0:00 [myprocess] <defunct>
收集僵尸進程
收集Zombie進程的信息,并終結這些僵尸進程,需要我們在父進程中使用waitpid調用和wait調用。這兩者的作用都是收集僵尸進程留下的信息,同時使這個進程徹底消失。
總結
以上是生活随笔為你收集整理的Linux的僵尸进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个袁姓好听的名字!
- 下一篇: 进程等待