wait函式的一些問題

2022-07-31 05:03:09 字數 1377 閱讀 1942

1 #include 23//

若成功則返回程序id,若出錯則返回-1

4 pid_t wait(int *statloc);

56 pid_t waitpid(pid_t pid,int *statloc,int options);

當乙個程序正常或異常終止時,核心就向其父程序傳送sigchld訊號。因為子程序終止是乙個非同步事件,所以這種訊號也是核心向父程序傳送的非同步通知。父程序可以選擇忽略該訊號,或者提供乙個該訊號發生時即被呼叫執行的函式(訊號處理程式)。對這種訊號的預設動作是忽略它。

對任一終止情形,我們都希望終止程序能夠通知其父程序它是如何終止的。該終止程序的父程序都能用wait或waitpid函式取得其終止狀態。

我們呢區分退出狀態和終止狀態。退出狀態是傳向exit或_exit的引數,或main的返回值。

呼叫wait或waitpid有三種不同的情況發生:

1、如果其所有子程序都還在執行,則阻塞

2、如果乙個子程序終止,正等待父程序獲取其終止狀態,則取得該子程序的終止狀態立即返回

3、如果它沒有任何子程序,則立即出錯返回

如果程序由於接收到sigchld訊號而呼叫wait,則可期望wait會立即返回,但是如果在任意時刻呼叫wait,則程序可能會阻塞。

在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有乙個選項,可使呼叫者不阻塞。

waitpid並不等待在其呼叫之後的第乙個終止子程序,他有若干選項,可以控制他所等待的程序。

如果statloc不是乙個空指標,則終止程序的終止狀態就存放在他所指向的單元內。

waitpid函式提供wait函式沒有提供的三個功能:

1、waitpid可等待乙個特定的程序,而wait則返回任一終止子程序的狀態

2、waitpid提供了乙個wait的非阻塞版本

3、waitpid支援作業控制

乙個已經終止、但是其父程序尚未對其進行善後處理(獲取終止子程序的有關資訊,釋放它仍占有的資源)的程序被成為殭屍程序(zombie)。

如果乙個程序fork乙個子程序,但不要它等待子程序終止,也不希望子程序處於殭屍狀態直到父程序終止,實現這一要求的技巧是呼叫fork兩次。

當多個程序都企圖對共享資料進行某種處理,而最後的結果又取決於程序執行的順序時,我們認為發生了競爭條件(race condition)。

如果乙個程序希望等待乙個子程序終止,則它必須呼叫乙個wait函式;如果乙個程序要等待其父程序終止,則可使用下列形式的迴圈:

1

while(getppid()!=1

)2 sleep(1);

這種輪詢(polling)浪費了cpu時間。為了避免競爭條件和輪詢,在多個程序之間需要有某種形式的訊號傳送和接收的方法。可以使用訊號機制或者程序間通訊(ipc)。

getline函式的一些問題

getline 的原型是 istream getline istream is string str char delim 其中 istream is 表示乙個輸入流,譬如cin string str表示把從輸入流讀入的字串存放在這個字串中 可以自己隨便命名,str什麼的都可以 char delim...

函式過載的一些問題

面試問題 void fun int,double void fun double,int 現在呼叫fun int int 會怎麼樣?函式過載的匹配過程有三步 1 確定候選函式,兩個原則 1 函式名相同 2 在呼叫點函式可見。顯然對於該題目來說兩個函式都是候選函式。2 確定可行函式,也是有兩個原則 1...

箭頭函式的一些問題

在普通函式中,this指向根據其使用場景不同改變。而箭頭函式中的this始終指向其父級作用域 var person p 此時的this並不是指向例項物件,而是指向父級作用域,指向window,所以不能作為建構函式 如果想要實現不定引數的呼叫,就使用.剩餘引數實現 var sayhi b consol...