程序等待的基礎概念
程序等待就是為了同步父程序和子程序,如把運算放到子程序,賦值放到父程序,可能需要讓父程序等待子程序運算結束.乙個程序在終止時會關閉所有的檔案描述符,釋放在使用者空間分配的記憶體,但他的pcb還保留著,核心在其中儲存了一些資訊:如果是正常終
止則儲存著退出狀態,如果是異常退出則儲存著導致該程序終止的訊號是哪個. 這個程序的父程序可以呼叫wait或waitpid獲取這
些資訊,然後徹底消除掉這個程序。我們知道乙個程序的退出狀態可以在shall中用特殊變數 $?檢視,因為shell是它的父程序,當它終止時
shell呼叫wait或waitpid得到它的退出狀態同時徹底清除這個程序。
當乙個程序正常或異常終止時,核心就向父程序傳送乙個sigchld訊號。因為子程序終止是乙個非同步時間,所以發生這種訊號發生程序的三種基本狀態也是核心向父程序發的非同步通知。父程序可以選擇忽略該訊號,或者提供乙個該訊號發生時既被呼叫執行的函式。對於這種訊號的系
統預設 動作是忽略它。 而父程序如果需要處理掉子程序就要呼叫wait和waitpid命令.
程序在執行中不斷地改變其執行狀態。通常,乙個執行程序必須具有以下三種基本狀態。父程序呼叫wait和waitpid函式後
如果其所有子程序都還在執行,則阻塞.
如果乙個子程序已終止,正等待父程序獲取其終止狀態,則取得該子程序的終止態立即返回.
如果它沒有任何子程序,則立即出錯返回.
wait/waitpid函式標頭檔案:#include
#include
wait函式:pid_t wait(int* status)
返回值: 成功返回被等待程序pid,失敗返回-1.
引數:輸出型引數,獲取子程序退出的狀態不關心設定空.如果程序由於接收到sigchld而呼叫wait,則會期望wait會立即返回.但如果
在任意時刻呼叫wait,則程序可能阻塞.在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有乙個選項,可使呼叫者不阻塞.如果
status不是乙個空指標,則終止程序的終止狀態就存放它所指的單元內。 如果不關心終止狀態,則可將該引數設為空指標.
waitpid函式:pid_t waitpid(pid_t pid,int
*status,int options);
返回值:
1當正常返回時waitpid返回手機的子程序的程序id
2.如果設定了選項wnohang,而呼叫中waitpid發現沒有退出的子程序可手機,賊返回0.
3.如果呼叫出錯返回-1
4.當pid所指示的子程序不存在,或此程序存在,但不是呼叫程序的子程序waitpid就會出錯返回,這是errno被設定為echild引數:
阻塞等待
#include
#include
#include
#include
int main()
else
if(pid == 0)
else
}}
非阻塞等待
#include
#include
#include
#include
int main()
else
if(pid == 0)
else
while(ret == 0);
if(wifexited(status)&& ret == pid)
printf("wait child 5s success,child return cod is:%d\n",wexitstatus(status));
else
}return
0;}
作業系統 程序終止,程序等待
程序終止 退出的幾種場景 執行結束,結果正確 執行結束,結果不正確 異常終止 程序常見的退出方法 正常終止 從main返回 呼叫exit exit 異常終止 注意exit 和 exit的區別 exit函式 include void exit int status 引數 status定義的程序的終止狀...
作業系統 程序
在作業系統中,作業系統將記憶體,網路,檔案系統抽象為資源的統一抽象表示。1 什麼是程序 程序就是進入記憶體中正在執行的程式。把程序當做一組元素組成的實體。程序包括兩個部分,一部分是 部分,另一部分是 相關的資料集合。程序控制塊 每乙個程序,在核心中都對應著乙個程序控制塊。程序控制塊中儲存著程序的所有...
作業系統 程序
程序是作業系統中的重要概念,描述了程式的執行資訊。乙個程序就是一次執行。可以把程式想象成類,程序就是例項。引入程序的概念有利於實現多程式並行的設計。每乙個程式執行的時候可以大致分為io任務和計算任務,如果乙個程序正在io,那麼應該把cpu讓給另乙個程序執行計算任務,這樣可以提公升cpu的利用率,這就...