UNIX環境高階程式設計筆記 8程序控制

2021-06-27 13:39:06 字數 2206 閱讀 1993

程序識別符號

記住2個函式,可以獲得自身程序號和父程序號:

pit_t getpid(void);

pie_t getppid(void);

fock函式(重點)

1、fock函式呼叫一次,但是返回兩次,在子程序中返回0,父程序中返回子程序id。由於程序id不可能為0(id為0的為系統程序),且乙個子程序只可以有乙個父程序呼叫getppid獲得,所以可以通過<0判斷fock失敗;==0判斷為子程序;>0判斷為父程序

2.子程序和父程序繼續執行fock後的指令。子程序是父程序的副本。例如,子程序獲得父程序的資料空間、堆和棧的副本。注意,這是子程序所擁有的副本。父、子程序並不共享這些儲存空間部分。父、子程序共享正文段。apue中的8-1程式清單需要好好理解,尤其是在控制台執行和重定向時i/o緩衝區的重新整理問題。

3.一般來說,在fock之後是父程序先執行還是子程序先執行是不確定的。可以使用程序控制和同步**來控制程序執行順序。

4.fock失敗的原因只有2個:一是已經有了太多的程序,例如工作中遇到的記憶體不足、控制代碼洩露等資源不足引起的問題;二是該實際使用者id的程序總數超過了系統限制。child_max來規定。

5.fock的2種用法:一是乙個父程序希望複製自己,使父、子程序同時執行不同的**段。在網路服務程序中常用——父程序等待客戶端的服務請求,當請求到達時,父程序呼叫fock,是子程序處理請求,父程序繼續等待下乙個服務;二是乙個程序要執行不同程式,例如shell。

exit函式

5種程序退出方式:main的return;exit函式;_exit或_exit函式;程序最後乙個執行緒返回;程序最後乙個執行緒呼叫pthread_exit;

3種異常終止方式:abort;程序街道某些訊號時,由自身註冊的訊號處理函式退出;最後乙個執行緒對「取消」做出響應。

不管程序如何和終止,最後都會執行核心中的同一段**。這段**為相應程序關閉所有開啟描述符,釋放它所使用的儲存器等。

除非保證父程序先於子程序結束或者

保證父程序在子程序結束前執行waitpid(),子程序均有機會成為殭屍程序。

父程序一次fork()後產生乙個子程序隨後立即執行waitpid(子程序pid, null, 0)來等待子程序結束,然後子程序fork()後產生孫子程序隨後立即exit(0)。這樣子程序順利終止(父程序僅僅給子程序收屍,並不需要子程序的返回值),然後父程序繼續執行。這時的孫子程序由於失去了

它的父程序

(即是父程序的子程序),將被轉交給init程序託管。於是父程序與孫子程序無繼承關係了,它們的父程序均為init,init程序在其子程序結束時會自動收屍,這樣也就不會產生殭屍程序了。

exec函式

fork建立子程序後,子程序往往要呼叫一種exec函式以執行另乙個程式。當程序呼叫一種exec時,該程序執行的程式完全替換為新的程式,而新的程式則從其main函式開始執行。因為exec並不建立新程序,所以前後的程序id並未改變。exec知識用乙個全新的程式替換了當前的正文、資料、堆和棧段。

重要:用fork可以建立新程序,用exec可以執行新程式。exit函式和兩個外套函式處理終止和等待終止。這些是基本的程序控制原語。用這些原語來理解後構造popen和sysem之類的函式

wait和waitpid函式

當乙個程序正常或異常終止時,核心就像其父程序傳送sigchld訊號。

pid_t wait(int *statloc);

pid_t waitpid(pid_t pid, int *statloc, int option);

兩個函式返回值:成功返回程序id,0,出錯返回-1.

直譯器檔案

所有現今的unix系統都支援直譯器檔案(interpreter file)。這是文字檔案,起始格式是:#! pathname [optional-argument]

核心使呼叫exec函式的程序實際執行的並不是該直譯器檔案,而是第一行中pathname指定的檔案。

要將直譯器檔案(例如shell指令碼檔案)直譯器(例如/bin/bash)區分開

Unix環境高階程式設計筆記 8 程序控制

1 程序識別符號 每個程序都有乙個非負整型表示的唯一程序id。id為1通常是init程序,在自舉過程結束時由核心呼叫。該程序檔案在 etc init include gid t getegid void 獲取有效使用者id uid t geteuid void git t getgid void u...

Unix環境高階程式設計筆記 7 程序環境

1 程序終止 a 程序終止的8種方式 從main返回 呼叫exit 呼叫 exit或 exit 最後乙個執行緒從其啟動程序返回 最後乙個執行緒呼叫pthread exit 呼叫abort 接到乙個訊號並終止 最後乙個執行緒對取消請求做出響應 b exit函式 exit和 exit立即進入核心,exi...

程序退出(UNIX環境高階程式設計筆記)

如果父程序fork了乙個子程序,父程序先於子程序終止,子程序的父程序將改為init程序。其大致操作是 在乙個程序終止時,核心諸葛檢查所有活動程序,以判斷它是否是正要終止程序的子程序,如果是,則該程序的父程序id就更改為1。核心為每個終止子程序儲存了一定量的資訊,當終止程序的父程序通過wait或wai...