程序控制原語

2021-03-31 08:57:01 字數 1619 閱讀 5787

unix

下的程序控制原語用於控制程序的建立、執行、終止等。其基本原語如下: 用

fork

建立新程序,用

exec

執行新的程式,

exit

函式和兩個

wait

函式處理終止和等待終止。下面分別講解一下:

除了交換程序(

)、init

程序和精靈程序(

daemon

)外,乙個現存程序呼叫

fork

函式是unix

核心建立乙個新程序的唯一方法。由

fork

建立的新程序被稱為子程序(

child process

)。該函式被呼叫一次,但返回兩次。兩次返回的區別是子程序的返回值是

0,而父程序的返回值則是新子程序的程序

id。子程序是父程序的複製品。例如,子程序獲得父程序資料空間、堆和棧的拷貝。注意,是拷貝,不是共享(可共享的

text

段除外)。一般來說,在

fork

之後是父程序先執行還是子程序先執行是不確定的。這取決於核心所使用的排程演算法。

fork

的典型用法為:

1) 乙個父程序希望複製自己,使父、子程序同時執行不同的**段;

2) 乙個程序要執行乙個不同的程式。在這種情況下,子程序在從

fork

返回後立即呼叫

exec。

對於exit

,以前有過說明,這裡再補充一點。如果父程序在子程序之前終止,則對於其父程序已經終止的所有程序,它們的父程序都改變為

init

程序。乙個已經終止、但是其父程序尚未對其進行善後處理(獲取終止子程序的有關資訊、釋放它仍占用的資源)的程序被稱為僵死程序。要解決僵死程序的問題,可以

fork

兩次,父

->

子->

孫,中間讓子程序

exit

,這樣孫程序的父程序就變為

init

了,而init

被編寫成只要有乙個子程序終止,

init

就會呼叫乙個

wait

函式取得其終止狀態並處理善後,從而防止了在系統中有很多僵死程序。

wait

和waitpid

都用於處理程序終止的。二者有一定區別,在乙個子程序終止前,

wait

使其呼叫者阻塞,而

waitpid

有一選擇項,可使呼叫者不阻塞。並且

waitpid

還有一些可控制的選項(詳情請查書)。關於二者還有一些巨集可用。

exec

函式有六種,統稱為

exec

。當程序呼叫一種

exec

函式時,該程序完全由新程式代換,而新程式則從其

main

函式開始執行。因為呼叫

exec

並不建立新程序,所以前後的程序

id並未改變。

exec

只是用另乙個新程式替換了當前程序的正文、資料、堆和棧。

具體對於程序的控制,還有很多細節的地方,比如引數的傳入,環境變數的使用,父、子程序的同步等等,太多了也記不住,用到的時候再說,先大概了解乙個流程吧,偷個懶j。

程序 執行緒控制原語對比

程序 執行緒 fork pthread create exit int pthread exit wait int pthread join void kill pthread cancel 殺死執行緒,但必須到達取消點 getpid pthread self 命名空間 注 執行緒處於分離狀態,不可...

作業系統 程序控制原語

為了實現程序控制,在作業系統核心中,有一組程式專門用於完成對程序的控制,這些原語至少需要包括建立新程序原語,阻塞程序原語,喚醒程序原語,終止程序原語,系統服務對使用者開放,即使用者可以通過相應的介面來使用它們。從pcb集合中申請乙個空白的pcb,將呼叫者引數 如程序外部識別符號,初始cpu狀態,程序...

linux執行緒控制原語2

將單個執行緒退出 void pthread exit void retval 引數 retval表示執行緒退出狀態,通常傳null 思考 使用exit將指定執行緒退出,可以嗎?pthrd exit.c include include include include void tfn void arg...