檢視程序狀態的命令:
ps aux
ps axj 命令
r(running):可執行狀態
並不一定正在占有cpu,它表明程序要麼是正在執行,要麼是在執行佇列裡。實際上分為running和ready兩種狀態。
s(task_interruptible):可中斷的睡眠狀態
處於這個狀態的程序因為等待某事件的發生,比如soket連線、訊號量而被掛起。
d(task_uninterruptible):不可中斷的睡眠狀態
程序處於睡眠狀態,但是此刻程序是不可中斷的。指的並不是cpu不響應外部硬體的中斷,而是不響應非同步訊號。
而task_uninterruptible狀態存在的意義就在於,核心的某些處理流程是不能被打斷的。如果響應非同步訊號,程式的執行流程中就會被插入一段用於處理非同步訊號的流程(這個插入的流程可能只存在於核心態,也可能延伸到使用者態),於是原有的流程就被中斷了。t(task_stopped or task_traced):暫停狀態或跟蹤狀態
向程序傳送乙個sigstop訊號,它就會因響應該訊號而進入task_stopped狀態(除非該程序本身處於task_uninterruptible狀態而不響應訊號)。(sigstop與sigkill訊號一樣,是非常強制的。不允許使用者程序通過signal系列的系統呼叫重新設定對應的訊號處理函式。)
向程序傳送乙個sigcont訊號,可以讓其從task_stopped狀態恢復到task_running狀態。
x(task_dead - exit_dead):退出狀態,程序即將被銷毀
這個狀態只是乙個返回狀態,你不會在任務列表裡看到這個狀態。
z(task_dead - exit_zombie):退出狀態,程序成為殭屍狀態。
程序在退出的過程中,處於task_dead狀態。
在這個退出過程中,程序占有的所有資源將被**,除了task_struct結構(以及少數資源)以外。於是程序就只剩下task_struct這麼個空殼,故稱為殭屍。
乙個程序可以通過呼叫fork函式來建立乙個新的程序,即子程序。
程序引數:
返回值的區別:
孤兒程序就是父程序先於子程序退出。
父程序退出後,子程序被id=1的init程序領養了。每當有孤兒程序出現的時候,init程序就會收養它並成為它的父程序。
危害:孤兒程序會被init程序接管,所以沒有危害。
任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個 子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時 處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。 如果父程序在子程序結束之前退出,則子程序將由init接管。init將會以父程序的身份對殭屍狀態的子程序進行處理。
正常情況下,子程序是通過父程序建立的,子程序在建立新的程序。子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序 到底什麼時候結束。
和孤兒程序相反,子程序先行退出,而父程序又沒有處理**釋放的子程序的資源,這個時候子程序就成了殭屍程序。
乾掉父程序
乾掉父程序,讓剩下的子程序變成孤兒程序,就會由init接管,並且處理這些程序的資源釋放工作。
父程序呼叫wait 或 waitpid
特別注意,殭屍程序是不能使用 kill 命令清除掉的。因為 kill 命令只是用來終止程序的,而殭屍程序已經終止
Linux 殭屍程序 Z狀態 和孤兒程序
先了解下程序都有什麼狀態 程序狀態 就緒,阻塞,執行 linux下程序狀態 執行狀態 並不意味著程序一定在執行中,它表明程序在執行中,或在執行佇列裡 只要拿到時間片就能執行 可中斷休眠狀態 s 當前處於休眠狀態,但這種休眠可以被打斷 也稱睡眠狀態 不可中斷休眠狀態 d 當前處於休眠狀態,但這種休眠不...
孤兒程序 殭屍程序
殭屍程序和孤兒程序 殭屍程序 殭屍程序是乙個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序的退出碼,就會產生殭屍程序,殭屍程序會一直儲存在程序表中,並且一直等待父程序讀取退出狀態碼。所以,只要子程序退出,父程序還在執行,但是父程序沒有讀取到子程序的狀態,子程序就會進入殭屍狀態。建立乙個殭屍程序...
殭屍程序, 孤兒程序
一,定義 當程序退出並且父程序 使用wait 系統呼叫 沒有讀取到子程序退出的返回 時就會產生殭屍程序。殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態 簡單來說就是,在父程序中有乙個子程序,該子程序完成父程序交給的任務,子程序完成後會給父程序乙個任務結果返回,但父程序一直沒有...