天天看點

busybox裡的僵屍程序為何那麼多

busybox裡面的僵屍程序很多是有目共睹的,為什麼呢?這要從僵屍程序的概念說起,所謂僵屍程序實際上就是沒有人回收的程序,什麼也沒有了,隻剩下 task_struct這個空殼子了,task_struct裡面的字段都沒有了,都被釋放了但是task_struct本身還在,占據着 sizeof(struct task_struct)大小的空間,其空虛的task_struct仍然在全局的task_struct連結清單中挂着,這樣周遊整個系統的程序的時候仍然 可以找到它,在使用者空間ps的時候仍然可以看到僵屍程序。但是為何會有這種程序呢?這得從程序回收說起。程序在以下情況下被回收: 

1.父程序調用wait系統調用等待子程序; 

2.系統在父程序顯式忽略SIGCHLD信号的時候進行回收。 

那麼在别的情況下,該程序就會成為僵屍程序,這怎麼了解呢?一般情況下,當一個程序結束的時候都要向其父程序發送SIGCHLD信号,什麼情況呢?就是父程序沒有将SIGCHLD信号設定為SIG_IGN并且沒有設定為SIG_DFL,滿足以上條件的話,父程序收到信号後必須調用wait進行回收,如果沒有wait,那麼該子程序就會變成僵屍程序,如果父程序将信号設定為SIG_DFL,那麼退出程序照樣向父程序法信号,隻不過父程序不處理,子程序會成為僵屍,這是情況一;情況二就是父程序将SIGCHLD信号設定為SIG_DFL,這樣的話當子程序結束時不會向父程序發送SIGCHLD信号,而且核心也 不會幫着回收,這樣的話該結束的子程序一定會變成僵屍程序;情況三就是父程序顯式乎略了SIGCHLD信号,即設定為SIG_IGN,這樣的話核心會回收 子程序,故該子程序一定不會變成僵屍程序。為何如此複雜呢?呵呵,這是posix的約定,問他們去吧。我們可以從核心源代碼看個究竟,當程序exit的時候,調用就到了do_exit:

asmlinkage NORET_TYPE void do_exit(long code)

{

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273439

繼續閱讀