L010Linux和androidNDK之linux避免僵尸進程控硼,子進程退出的處理

L010Linux和androidNDK之linux避免僵尸進程,子進程退出的處理

如果你在程序中fork出一個子進程夺蛇,沒有好好處理子進程退出后的相關事宜,那么就有可能召喚出傳說中進程界的僵尸---僵尸進程:ㄕ汀5笊狻!

什么是僵尸進程

一個進程在調用exit命令結束自己的生命的時候闻镶,其實它并沒有真正的被 僵尸進程銷毀甚脉, 而是留下一個稱為僵尸進程(Zombie)的數據結構(系統(tǒng)調用exit,它的作用是 使進程退出铆农,但也僅僅限于將一個正常的進程變成一個僵尸進程牺氨,并不能將其完全銷毀)

僵尸進程是怎么樣產生

在Linux進程的狀態(tài)中,僵尸進程是非常特殊的一種墩剖,它已經放棄了幾乎所有內存空間猴凹,沒有任何可執(zhí)行代碼,也不能被調度岭皂,僅僅在進程列表中保留一個位置郊霎,記載該進程的退出狀態(tài)等信息供其他進程收集,除此之外爷绘,僵尸進程不再占有任何內存空間书劝。它需要它的父進程來為它收尸进倍。

如果他的父進程沒安裝SIGCHLD信號處理函數調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號购对,那么它就一直保持僵尸狀態(tài)猾昆,如果這時父進程結束了,那么init進程自動會接手這個子進程骡苞,為它收尸垂蜗,它還是能被清除的。

但是如果父進程是一個循環(huán)烙如,不會結束么抗,那么子進程就會一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時會有很多的僵尸進程亚铁。系統(tǒng)所能使用的進程號是有限的,如果大量的產生僵死進程,將因為沒有可用的進程號而導致系統(tǒng)不能產生新的進程.

異步回收僵尸進程:

fork()之后蝇刀,子進程從父進程獲取了一份拷貝,和父進程分別獨立運行徘溢,僵尸進程的產生是因為父進程沒有給子進程“收尸”造成的吞琐,又可以根據危害程度分為下述兩類:
總體來說:當子進程結束之后,但父進程未結束之前然爆,子進程將成為僵尸進程站粟。
(1)當子進程結束之后,但父進程未結束之前曾雕,子進程將成為僵尸進程奴烙,父進程結束后僵尸被init進程回收。
(2)如果子進程結束了剖张,但是父進程始終沒有結束切诀,那么這個僵尸將一直存在,而且隨著exec搔弄,僵尸越來越多幅虑。

相關回收進程的函數

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

pid_t waitpid(pid_t pid,int * status,int options);
pid_t wait (int * status);

其中 wait(&status);等價于waitpid(-1, &status, 0);

waitpid()會暫時停止目前進程的執(zhí)行,直到有信號來到或子進程結束
如果在調用 waitpid()時子進程已經結束,則 waitpid()會立即
返回子進程結束狀態(tài)值顾犹。 子進程的結束狀態(tài)值會由參數 status 返回,
而子進程的進程識別碼也會一起返回倒庵。如果不在意結束狀態(tài)值,則
參數 status 可以設成 NULL。參數 pid 為欲等待的子進程識別碼,
其他數值意義如下:

pid<-1 等待進程組識別碼為 pid 絕對值的任何子進程炫刷。
pid=-1 等待任何子進程,相當于 wait()擎宝。
pid=0 等待進程組識別碼與目前進程相同的任何子進程。
pid>0 等待任何子進程識別碼為 pid 的子進程浑玛。

參數options提供了一些額外的選項來控制waitpid认臊,參數 option 可以為 0 或可以用"|"運算符把它們連接起來使用

#include <stdio.h>   
#include <stdlib.h>   
#include <signal.h>   
#include <unistd.h>   
#include <sys/wait.h>   
    
void handler(int num) {   
    //我接受到了SIGCHLD的信號啦   
    int status;   
    int pid = waitpid(-1, &status, WNOHANG);   
    if (WIFEXITED(status)) {   
        printf("The child %d exit with code %d\n", pid, WEXITSTATUS(status));   
    }   
}   
    
int main() {   
    //子進程的pid   
    int c_pid;   
    int pid;   
    
    signal(SIGCHLD, handler);   
    
    if ((pid = fork())) {   
        //父進程   
        c_pid = pid;   
        printf("The child process is %d\n", c_pid);   
    
        //父進程不用等待,做自己的事情吧~   
        int i=0;
        for ( i = 0; i < 16; i++) {   
            printf("Do parent things.\n");   
            sleep(1);   
        } 

        printf("Do parent end\n"); 
    
        exit(0);   
    } else {   
        //子進程   
        printf("I 'm a child.\n");   
        sleep(2);   
        exit(0);   
    }   
} 

子進程的結束狀態(tài)

WIFEXITED/WEXITSTATUS/WIFSIGNALED
If the exit status value (*note Program Termination::) of the child  
process is zero, then the status value reported by `waitpid' or `wait'  
is also zero. You can test for other kinds of information encoded in  
the returned status value using the following macros. These macros are  
defined in the header file `sys/wait.h'.  
-- Macro: int WIFEXITED (int STATUS)  
     This macro returns a nonzero value if the child process terminated  
     normally with `exit' or `_exit'.  
-- Macro: int WEXITSTATUS (int STATUS)  
     If `WIFEXITED' is true of STATUS, this macro returns the low-order

8 bits of the exit status value from the child process. *Note  
     Exit Status::.  
-- Macro: int WIFSIGNALED (int STATUS)  
     This macro returns a nonzero value if the child process terminated  
     because it received a signal that was not handled. *Note Signal  
     Handling::

子進程的結束狀態(tài)返回后存于status锄奢,如下有幾個宏可判別結束情況

WIFEXITED(status)如果子進程正常結束則為非0值失晴。  
WEXITSTATUS(status)取得子進程exit()返回的結束代碼,一般會先用WIFEXITED 來判斷是否正常結束才能使用此宏拘央。  

WIFSIGNALED(status)如果子進程是因為信號而結束則此宏值為真 

WTERMSIG(status)取得子進程因信號而中止的信號代碼涂屁,一般會先用WIFSIGNALED 來判斷后才使用此宏。  
WIFSTOPPED(status)如果子進程處于暫停執(zhí)行情況則此宏值為真灰伟。一般只有使用WUNTRACED 時才會有此情況拆又。  
WSTOPSIG(status)取得引發(fā)子進程暫停的信號代碼,一般會先用WIFSTOPPED 來判斷后才使用此宏栏账。


kill -STOP 1234 進程暫停帖族。
kill -CONT 1234     進程繼續(xù)

參考鏈接

  1. 異步回收fork出的子進程(僵尸進程)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挡爵,隨后出現(xiàn)的幾起案子竖般,更是在濱河造成了極大的恐慌,老刑警劉巖茶鹃,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣雕,死亡現(xiàn)場離奇詭異,居然都是意外死亡闭翩,警方通過查閱死者的電腦和手機挣郭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疗韵,“玉大人兑障,你說我怎么就攤上這事〗锻簦” “怎么了流译?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肤无。 經常有香客問我先蒋,道長,這世上最難降的妖魔是什么宛渐? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任竞漾,我火速辦了婚禮,結果婚禮上窥翩,老公的妹妹穿的比我還像新娘业岁。我一直安慰自己,他們只是感情好寇蚊,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布队他。 她就那樣靜靜地躺著,像睡著了一般识颊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上借笙,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音较锡,去河邊找鬼业稼。 笑死,一個胖子當著我的面吹牛蚂蕴,可吹牛的內容都是我干的低散。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼骡楼,長吁一口氣:“原來是場噩夢啊……” “哼熔号!你這毒婦竟也來了?” 一聲冷哼從身側響起鸟整,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤引镊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吃嘿,有當地人在樹林里發(fā)現(xiàn)了一具尸體祠乃,經...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年兑燥,在試婚紗的時候發(fā)現(xiàn)自己被綠了亮瓷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡降瞳,死狀恐怖嘱支,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情挣饥,我是刑警寧澤除师,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站扔枫,受9級特大地震影響汛聚,放射性物質發(fā)生泄漏。R本人自食惡果不足惜短荐,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一倚舀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忍宋,春花似錦痕貌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春哺徊,著一層夾襖步出監(jiān)牢的瞬間室琢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工唉工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留研乒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓淋硝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宽菜。 傳聞我的和親對象是個殘疾皇子谣膳,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內容

  • Linux 進程管理與程序開發(fā) 進程是Linux事務管理的基本單元,所有的進程均擁有自己獨立的處理環(huán)境和系統(tǒng)資源铅乡,...
    JamesPeng閱讀 2,467評論 1 14
  • 又來到了一個老生常談的問題继谚,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢? 今天就這個問題開始阵幸,來談談操...
    tangsl閱讀 4,124評論 0 23
  • 一花履、進程的創(chuàng)建和調度 相關概念: 最基礎的計算機動作被稱為指令(instruction)。 程序(program)...
    穹藍奧義閱讀 4,658評論 0 6
  • O 昨天和茵子去看了招商公園1872的商住兩用的LOFT挚赊,地段不錯诡壁,小區(qū)環(huán)境很好、房子不錯(可改小復式)荠割、配套設施...
    紅鞋子跳跳跳閱讀 327評論 13 3
  • 燕兒在藍天里飛妹卿, 看它們的羽翼。 看它們的羽翼蔑鹦, 有時候急燥夺克, 有時候悠閑。 燕兒在藍天里飛嚎朽, 夕陽在它們身上铺纽。 ...
    君兮閱讀 230評論 5 0