作業系統 程序等待

2021-08-21 11:15:10 字數 1997 閱讀 1209

程序等待的基礎概念

程序等待就是為了同步父程序和子程序,如把運算放到子程序,賦值放到父程序,可能需要讓父程序等待子程序運算結束.乙個程序

在終止時會關閉所有的檔案描述符,釋放在使用者空間分配的記憶體,但他的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的利用率,這就...