在每個程序退出如呼叫exit或return的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等,但是程序並沒有立馬就消失,而是仍然為其保留一定的資訊(包括程序號,退出狀態,執行時間, 直到父程序通過wait/waitpid來處理時才進行釋放。此時該程序處於殭屍狀態,該程序成為僵死程序(zombie process)。
它需要它的父程序來為它收屍,如果他的父程序沒安裝sigchld訊號處理函式呼叫wait或waitpid()等待子程序結束,又沒有顯式忽略該訊號, 那麼它就一直保持僵死狀態,此時即使是root使用者也無法清理,如果這時父程序結束了,僵死的子程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理僵死程序,它產生的所 有僵死程序也跟著消失(每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序, 看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init來接管他,成為他的父程序)。
利用命令ps,可以看到有標記為z的程序就是僵死程序
僵死程序的避免
1、父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起
2、呼叫signal或sigset將sigchld的配置設定為忽略,則不會產生僵死子程序。
linux中也可使用這個,在乙個程式的開始呼叫這個函式signal(sigchld,sig_ign);
3、fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork乙個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的**還要父程序來做。
4、改寫父程序,在子程序死後要為它收屍。具體做法是接管sigchld訊號。子程序死後,會傳送sigchld訊號給父程序,父程序收到此訊號後,執行waitpid()函式為子程序收屍。這是基於這樣的原理:就算父程序沒有呼叫wait,核心也會向它傳送sigchld訊息,儘管對的預設處理是忽略,如果想響應這個訊息,可以設定乙個處理函式。
當然,我們知道wait的函式原型為 pid_t wait(int *status),因此我們可以利用status引數來儲存被收集程序退出時的一些狀態,通過呼叫此時未釋放的struct_task結構體裡的一些內容來返回判斷。
關於熵的一些理解
對於理工科學生來說,熵 並不是乙個陌生的名詞。在諸如 大學物理 熱力學 和 資訊理論 等課程中都會有所介紹。但同時 熵 又是乙個顯得有點神秘的概念,看不見也摸不著。我最早是在高中物理課中聽說的,大概是在介紹 熱力學第二定律 時提到的。熱力學第二定律的內容是 熱力學過程是不可逆的 孤立系統自發地朝著熱...
關於float的一些理解
float是否脫離文件流,乙個父元素不設定overflow的話,子元素float,就不會把父元素撐開,換句話說,他就不會有高度,但是做個demo 父元素overflow hidden 子元素前兩個float,第三個不float,結果是第三個沒有clear浮動的元素,跟float的元素出現在同乙個位置...
關於android layout的一些理解
1 wrap content view的尺寸根據它的內容確定 match parent view的尺寸盡量和它的parent view group一樣大 2 獲得view的位置 position getleft gettop getright getleft getwidth getwidth 3 ...