程序就是乙個pcb(process control block),是作業系統對執行中程式的描述,通過這個描述實現對執行中程式的排程管理,linux下pcb是乙個task_struct結構體,task_struct是linux核心的一種資料結構。
task_struct結構體中的內容
包括記憶體指標,上下文資料,程式計數器,程序識別符號(pid),程序狀態,優先順序,io資訊等
在知道程序概念的基礎上,我們再來看乙個程序的建立
pid_t fork(void);//建立乙個子程序
fork具有兩個返回值,因此在建立子程序之後,我們通常使用if來對父子程序進行分流,返回值為0表示子程序,返回值大於0表示父程序(也就是說對於父程序返回的子程序pid)。
比如下面的**示例:
int main()
else if (pid == 0) //返回值為0,是子程序進入的判斷
else //返回值大於0,是父程序進入的判斷
return 0;
}
為了弄明白正在執行的程序是什麼意思,我們需要了解程序的不同狀態。
程序狀態可以大體上分為以下5種:
r 執行狀態:並不意味著程式一定在執行,它表示的是程式要麼在執行中,要麼在執行佇列裡。
s 可中斷休眠態:意味著程序在等待事件完成(能夠被一些中斷喚醒的休眠狀態)
d 不可中斷休眠態:也叫磁碟休眠狀態,處於這個狀態的程序通常會等待io結束(不能被中斷喚醒的休眠狀態,只能等待條件滿足之後自動喚醒)
t 停止狀態:當前不再執行,什麼都不做(可以通過給程序傳送sigstop訊號 來停止程序,這個被停止的程序也可以通過傳送sigcont讓程序繼續執行)
z 僵死狀態:程序已經退出,但是資源沒有完全釋放
程序狀態檢視:ps -aux
在此基礎上,引出殭屍程序的概念,這需要我們重點去理解!
首先,什麼是殭屍程序?殭屍程序是如何產生的?資源沒有完全釋放又是什麼意思?殭屍程序有什麼危害?以及殭屍程序該如何處理?
殭屍程序就是指處於僵死狀態的程序(z),該程序已經退出不在執行,但是資源並沒有完全釋放
殭屍程序的產生是由於子程序先於父程序退出,並且父程序並沒有關注到子程序的退出狀態,此時子程序就會變成乙個殭屍程序
我們可能會去思考,子程序退出的時候,為什麼不直接釋放掉相關資源,這樣不就不會產生殭屍程序了嗎?這其實也就是我們下面要提到的,也就是子程序退出後,資源沒有完全釋放是什麼意思!
其實,子程序在退出的時候會儲存退出原因,子程序要告訴父程序自己為什麼退出了,如果父程序沒有關注到子程序的退出原因,子程序就會一直儲存自己的退出原因,導致資源無法完全釋放。
進一步,由於使用者所能建立的程序數量是有限的,並且資源沒有完全**是會佔據記憶體資源的,這也就是殭屍程序的危害,導致資源洩露
處理殭屍程序的方法
最為簡單直接的就是退出父程序,子程序儲存退出原因就是為了給父程序看的,既然父程序已經退出了,那麼子程序儲存退出原因也就沒有意義了,因此父程序退出之後,子程序的資源也就釋放了。
除此之外,我們常用的方法是程序等待,由於父程序對於子程序的退出預設是忽略,因此我們可以使用程序等待,讓父程序等待並關注子程序的退出,**子程序的資源,獲取子程序的退出資訊。
wait方法
pid_t wait(int* status);
返回值:成功返回被等待的程序pid,失敗則返回-1
引數:輸出型引數,通過該引數獲取子程序的退出狀態,如果不關心子程序的退出狀態,只是為了防止殭屍程序的產生,可以置為null。
waitpid方法
pid_t waitpid(pid_t pid, int* status, int options);
返回值:正常返回時會返**集到的子程序的pid
如果設定了 wnohang(非阻塞等待),呼叫如果沒有發現有子程序退出則返回0
出錯返回-1
引數:pid == -1,表示等待任意乙個子程序,此時與wait類似
pid > 0,表示等待指定的子程序退出
status輸出型引數,表示獲取子程序退出狀態
options:設定為wnohang表示非阻塞等待,呼叫如果沒有發現有子程序退出則返回0
設定為0,表示阻塞等待,沒有子程序退出就一直等下去
呼叫waitpid之後我們可以使用
wifexited(status);//若為正常終止子程序返回的狀態,則為真。(可檢視程序是否正常退出)
wexitstatus(status);//若果wifexited(status)為真,可提取子程序退出碼。(用來檢視子程序的退出碼)
總結
如果子程序已經退出,呼叫wait/waitpid,會立即返回,並且釋放資源,獲得子程序退出資訊。
如果任意時刻呼叫wait/waitpid,子程序存在並且還在執行,wait會阻塞等待直到子程序退出,waitpid若使用wnohang則不會阻塞,直接返回0,若設定為0,則阻塞等待。
等待的子程序不存在,直接報錯返回。
Linux 程序概念以及程序狀態理解
2 程序狀態 2.2 孤兒程序 2.3 守護程序 精靈程序 程序是乙個pcb 程序控制塊 是乙個執行程式中的描述 在linux下是乙個task struct結構體,通過這個結構體實現作業系統對執行中程式的排程管理。1.1 task struct結構體 task struct結構體是linux核心中的...
程序概念和程序狀態
檢視程序 程序狀態 孤兒程序 執行中的程式。對於作業系統來說就是pcb程序控制塊,在linux中就是乙個task struct結構體。是作業系統對程式執行的動態描述,系統通過這個描述實現程式執行的管理和排程。要執行main這個程式,作業系統找到對應main的pcb,在pcb上讀取main執行所需要的...
Linux下獲取程序狀態
1 在 proc目錄下包含了一些以數字命名的子目錄,這些目錄就是系統當前執行程序的proc抽象。每乙個目錄都以相關聯的活動系統程序pid為目錄名,在裡面包含了一些檔案,用於顯示程序相關資訊。每建立乙個程序都會在 proc下生成乙個以該程序pi d為名的目錄 2 在 proc下,還有乙個目錄 proc...