什麼是殭屍程序?在
unix/linux
系統中,通過
fork
建立子程序。子程序結束時,他的父程序並沒有等待(呼叫
wait/waitpid
)他,則他成為乙個殭屍程序。但如果該程序的父程序已經結束了,那麼該程序就不會變成殭屍程序,因為每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序,看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話就交由
pid為1的
init
程序來接管他,
init
成為這個程序的父程序。父程序先終止就沒有事~
乙個程序在呼叫
exit
命令結束自己生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序(
zombie
)的資料結構。系統呼叫
exit
的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀。在
linux
程序的狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所有的空間,沒有任何可執行**,也不能被排程,僅僅在程序的列表中保留乙個位置,記載該程序的退出狀態等資訊供其他程序收集。除此之外,殭屍程序不再占有任何記憶體空間。它需要他的父程序來為他收屍,如果他的父程序沒有安裝
sigchld
資訊處理函式呼叫
wait
或waitpid
等待子程序的結束,又沒有顯示忽略該資訊,那麼它就一直保持殭屍狀態,如果這時候父程序結束了,那麼
init
程序自動會接手這個子程序,為它收屍,它還是能被清除的。但是如果父程序是乙個迴圈,不會結束,那麼子程序交一直保持殭屍狀態,這就是為什麼系統中有時會有很多殭屍程序。
檢視殭屍程序的命令:
ps。一些系統可能使用
而不是標註殭屍程序。
寫乙個殭屍程序的例子看看:
編譯這個程式:
gcc –o test test.c
後台執行這個程式:
./test & 使用
ps命令檢視程序狀態:
pid ttytime cmd
28393 pts/100:00:00 bash
28908 pts/100:00:00 test
28909 pts/100:00:00 test
28911 pts/100:00:00 ps
當然,這個時候父程序一直在輸出
parent!
我們要把它
kill
掉,輸入命令:
kill 28908。
世界清靜了~
什麼是殭屍程序 zombie ?
殭屍程序是指乙個已經終止 但是其父程序尚未對其進行善後處理獲取終止程序的有關資訊的程序,這個程序被稱為 殭屍程序 zombie 怎樣產生殭屍程序 乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序 zombie 的資料結構 系統呼叫exit,它的作用是...
什麼是殭屍程序和孤兒程序?怎麼避免殭屍程序
孤兒程序 父程序退出,子程序還在執行的這些子程序都是孤兒程序,孤兒程序將被 init 程序 進 程號為 1 所收養,並由 init 程序對它們完成狀態收集工作。殭屍程序 程序使用 fork 建立子程序,如果子程序退出,而父程序並沒有呼叫 wait 或 waitpid 獲 取子程序的狀態資訊,那麼子程...
什麼是殭屍程序和孤兒程序?怎麼避免殭屍程序?
孤兒程序 父程序退出,子程序還在執行的這些子程序都是孤兒程序,孤兒程序將被init 程序 程序號為1 所收養,並由init 程序對他們完成狀態收集工作。殭屍程序 程序使用fork 建立子程序,如果子程序退出,而父程序並沒有呼叫wait 獲waitpid 獲取子程序的狀態資訊,那麼子程序的程序描述符仍...