程序管理之fork函式

2022-03-17 02:58:06 字數 1217 閱讀 1476

#include #include pid_t fork(void);
fork函式在父程序中返回子程序的pid,在子程序中返回0。注意在子程序中返回的0,並不是子程序的pid,子程序的pid在父程序的返回值中儲存。而子程序的返回值是為了標識它是子程序,用來區分父子程序的。那麼為什麼這樣設計父子程序的返回值呢?我的理解是這樣的:第一,對於父程序來說,它可能同時有多個子程序,並且沒有乙個函式可以獲得所有子程序的pid,所以它需要知道每個子程序的pid,這樣便於管理各個子程序;第二,對於子程序來說,它父程序只能有乙個,所以它可以不必實現和父程序類似的機制,獲取父程序的pid,它可以通過getpid函式獲取父程序的pid。而在核心中,程序pid為0,總是在核心交換程序時使用,所以程序的真實pid不可能為0。

fork函式並不是在被呼叫時,為子程序copy乙份父程序的副本,而是將父程序資料段、堆區和棧區的許可權改變為唯讀。當父子程序中任何乙個程序要修改該區域的值時,核心只會為修改區域的那塊記憶體製作乙個副本,通常是虛擬記憶體中的一頁。這樣的機制無需copy所有的父程序資源(這些資源在子程序中不一定有用),提高了程式的效率。但要注意,父子程序共享**段。

1)資料段、堆區、棧區、參數列和環境表和上文說的一樣,遵循讀時共享,寫時複製的機制;

2)環境表中只能改變其本身程序和其子程序的環境變數,無法改變其父程序的環境變數;

3)像是實際使用者id、實際組id、有效使用者id、有效組id、程序組id和附屬id,這些都是程序的屬性,所以存在於pcb中,每個程序都有自己的pcb節點,其中部分資料是繼承父程序的。當然pid不會。

4)對於檔案鎖,子程序是不會被繼承的。子程序雖然複製了檔案描述符表,但都指向同乙個檔案表,當然了,檔案表也就指向了同乙個i節點。在i節點中儲存著和檔案鎖相關的煉表頭節點(struct lockf)的位址。i節點資源不屬於程序資源,而是檔案資源,所以不會繼承檔案鎖。

void handler(int signs)

errno=tmp_errno;

}

但仍要注意的是,當waitpid返回值為-1時,會改變全域性變數errno的值,如果這是在主程式中檢測errno的值時,就很有可能發生衝突。因此,在進入訊號處理函式之前要儲存errno 的值,最後再回覆errno的值。

注意:安插訊號和利用孤兒程序的機制來避免殭屍程序的方法,不僅僅能避免殭屍程序,還能不影響父程序本身的工作任務,這一點是非常有用的。

程序管理之fork函式

include include pid t fork void fork函式在父程序中返回子程序的pid,在子程序中返回0。注意在子程序中返回的0,並不是子程序的pid,子程序的pid在父程序的返回值中儲存。而子程序的返回值是為了標識它是子程序,用來區分父子程序的。那麼為什麼這樣設計父子程序的返回值...

程序控制之fork函式

乙個現有程序可以呼叫fork函式建立乙個新程序。include pid t fork void 返回值 子程序中返回0,父程序中返回子程序id,出錯返回 1 由fork建立的新程序被稱為子程序 child process fork函式被呼叫一次,但返回兩次。兩次返回的唯一區別是子程序的返回值是0,而...

fork 與程序管理

fork用於複製程序,建立乙個子程序,被複製的程序稱為父程序,父程序與子程序併發執行 先複製乙個程序控制塊pcb 是乙個結構體,在linux中被稱為程序描述符 再複製程序實體 fork完後,父程序中返回值為pid t型別,值為子程序的pid,子程序中值為0 在兩個程序中,邏輯位址相同,實體地址不一定...