Linux的程序等待

2021-08-14 04:51:18 字數 2407 閱讀 6185

linux的程序等待

在學習程序等待之前,我們要弄清楚,兩個問題,乙個是為什麼要等待,還有乙個是怎麼等待?

首先:為什麼要程序等待?

程序終止或者退出的時候,程序就會關閉所有檔案描述符,然後釋放在使用者空間的分配的記憶體,但是程序的pcb會暫時保留,因為pcb中還儲存有程序的退出狀態,如果程序是正常退出,那麼退出狀態就是程序的退出碼,如果是異常退出,那程序的退出狀態就是導致程序退出的訊號,因為父程序必須要**子程序,如果父程序在子程序之前退出,那麼子程序就成了孤兒程序,所以父程序要拿到子程序的退出碼,然後釋放子程序。(來一點專業的描述:當乙個程序終止的時候,核心會向其父程序傳送訊號,通知父程序要等待子程序,父程序呼叫wait)。

再者,怎麼程序等待?

在此之前,我們先總結一下程序退出的狀態:①**執行結束,結果正確,退出碼為正常退出路徑的退出碼

②**執行結束,結果錯誤,退出碼為非正常退出路徑的退出碼

③**沒有執行結束,原因是收到某種退出訊號

現在我們就要介紹兩個系統呼叫函式:    wait   和waitpid

一、wait系統呼叫:pid_t wait (int* status)

引數:status, 是乙個輸出型引數,指向的空間存放著乙個int型別的數字。高八位是程式的退出碼,低七位是接收

到的訊號(如果程式有接收到訊號)

如果程式是**跑完,正常結束,那麼status裡面的高八位存著的就是程式的退出碼,低八位就是0,

也就是什麼訊號都沒有接收到。

如果程式是異常終止,那麼存著程式退出碼的高八位就是0,第七位存放著接收到的訊號

如果不關心,那麼也可以傳null進去。

返回值:返回值》0,那麼返回的就是等待程序的pid,這時候,我們就可以使用剛才的輸出型引數status來檢視程序的退出狀態。

返回值 == -1 ,那麼呼叫失敗,可能是因為沒有子程序

wait的等待方式,是阻塞型等待,也就是說,只有等到有子程序給他返回退出狀態的時候,他才會繼續,如果沒有子程序給他返回退出狀態,那麼父程序就會一直停止,處於等待的狀態,如果有多個子程序,那麼就會接收最先返回退出狀態的子程序

二、waitpid系統呼叫:pid_t waitpid(pid_t pid,int* status,int options)

引數解析:pid:要等待子程序的pid,(這也是和wait的區別之一),如果輸入:2554,那麼就會等待pid為2554的程序返回的狀態,

tip:如果pid傳進去的是-1,那麼就表示等待任意乙個程序的結束。

status :和wait的statu是同樣的,可以參考wait的status。

options: options設定成1,那麼就是阻塞式等待,和wait的效果一樣。

options設定成wnohang:那就是非阻塞式等待。當發現等待的程序沒有退出,就返回0。

返回值:返回值》0,等待成功,返回的是等待程序的pid

返回值==0, 等待的程序沒有返回退出狀態,也就是等待的那個程序沒有退出

返回值<0,呼叫失敗

現在我們給出wait呼叫的**:

該例子中,我們讓子程序sleep 5s,並且返回乙個比較明顯的返回值,123,父程序呼叫wait,之後接收到子程序的返回狀態,並把相關資訊列印出來

#include#include#include#includeint main()

else if(id > 0)

}else

return 0;

}

wait的呼叫結果:

在列印   「wait success! ret:2623,exitcode:123,sign:0」   這句話之前,停頓了5s,此時父程序就是在等待子程序給他返回退出碼。

再看看waitpid的呼叫**:

這個例子中,我們讓子程序sleep 5s,標記乙個明顯的退出碼123,此時呼叫waitpid,當子程序sleep的時候,父程序讀到的是乙個0的返回值,就會進入相應的迴圈分支

#include#include#include#includeint main()

else if(id<0)

else

else if(ret == 0)

else

}while(1);

}return 0;

}

waitpid的執行結果:

列印「father do other thing」,就說明進入了ret == 0的分支,

在列印「father do other thing」之後,就會sleep 2s,再去列印下一句。

LINUX 程序等待

wait 函式一般用在父程序中等待 子程序的資源,而防止殭屍程序的產生。什麼是殭屍程序?pid t wait int status 引數 status 是乙個整形指標。如果status不是乙個空指標,則終止程序的終止狀態將儲存在該指標所指向的記憶體單元中。如果不關心終止狀態,可以將 status引數...

Linux 程序等待

目錄 程序等待 程序等待的必要性 程序等待的方法 wait waitpid 引數int status 誰要等待?等待什麼?為什麼要等待 首先要知道程序終止或退出的時候會發生什麼,程序退出時會關閉所有檔案描述符,釋放在使用者空間分配的記憶體,但是pcb卻會暫時保留,裡面存著退出狀態,比如乙個程序正常退...

Linux 程序等待

阻塞等待 為了完成乙個功能發起呼叫,當前若不具備完成條件,等待直到條件具備完成功能後返回 非阻塞等待 為了完成乙個功能發起呼叫,當前若不具備完成條件,則立即報錯返回 wait方法 功能 阻塞等待 任意乙個子程序退出,獲取返回值 include include pid t wait int statu...