Linux下的程序概念,程序狀態和程序等待

2021-10-07 16:48:54 字數 2689 閱讀 5308

程序就是乙個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...