第五章 程序 函式fork

2021-10-25 07:43:23 字數 2808 閱讀 2440

#includepid_t fork(void)

//一次呼叫,兩次返回

詳情請參考fork的詳細用法

子程序和父程序繼續執行fork呼叫之後的指令

子程序是父程序的副本

子程序獲得父程序資料空間、堆和棧的副本

父子程序並不共享儲存空間

父子程序共享正文段(唯讀的)

為了提高效率,fork後不並立即複製父程序空間,採用了cow(copy-on-write)

當父子程序任意之一,要修改資料段、堆、棧時,進行複製操作,但僅複製修改區域

乙個程序,包括**、資料和分配給程序的資源。fork()函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。

乙個程序呼叫fork()函式後,系統先給新的程序分配資源,例如儲存資料和**的空間。然後把原來的程序的所有值都複製到新的新程序中,只有少數值與原來的程序的值不同。相當於轉殖了乙個自己。

#include

#include

intmain()

else

printf

("統計結果是: %d\n"

1、在fork函式執行完畢後,如果建立新程序成功,則出現兩個程序,乙個是子程序,乙個是父程序。在子程序中,fork函式返回0,在父程序中,fork返回新建立子程序的程序id。我們可以通過fork返回的值來判斷當前程序是子程序還是父程序。

2、在父程序中,fork返回新建立子程序的程序id;在子程序中,fork返回0;如果出現錯誤,fork返回乙個負值; 引用一位網友的話來解釋fpid的值為什麼在父子程序中不同。「其實就相當於鍊錶,程序形成了鍊錶,父程序的fpid(p 意味point)指向子程序的程序id, 因為子程序沒有子程序,所以其fpid為0.

3、建立新程序成功後,系統**現兩個基本完全相同的程序,這兩個程序執行沒有固定的先後順序,哪個程序先執行要看系統的程序排程策略。

4、fork是把程序當前的情況拷貝乙份,只拷貝下乙個要執行**的程序。

這個程序的列印順序可能沒那麼直觀,4528執行第乙個for迴圈,程序被複製了乙份,序號為0的程序乙個是parent乙個是child,結構如下:

2832 ->4528(原程序) ->4529 (第乙個for迴圈被建立出來的程序),接下來這兩個程序都要執行i=1之後的操作了;

4528進入到第二個for迴圈後,程序4528和程序4529變成了父程序,他們分別創造了子程序。結構如下:

2832->4528->4530 4528-> 4529->4531

第三步,最先兩個程序都都執行結束return 0 了,只有第二個for迴圈建立的4530和4531這兩個程序繼續執行第二個for迴圈。

fork的乙個特性:父程序的所有開啟檔案描述符,都被複製到子程序中,好像執行了dup函式。

檔案描述符的常見處理方式

◼父程序等待子程序完成。父程序無需對描述符做任何處理,當子程序終止後,檔案偏移量已經得到了相應的更新

◼父子程序各自執行不同的程式段,各自關閉檔案描述符

vfork()會產生乙個新的子程序.但是vfork建立的子程序與父程序共享 資料段,而且由vfork()建立的子程序將先於 父程序執行

vfork()用法與fork()相似.但是也有區別,具體區別歸結為以下3點:

1.fork():子程序拷貝父程序的 資料段, **段. vfork():子程序與父程序共享 資料段.

2 . fork():父子程序的執行次序不確定.

vfork():保證子程序先執行,在呼叫exec或_exit之前與 父程序資料是共享的,在它呼叫exec或_exit之後 父程序才可能被排程執行。

3.vfork()保證子程序先執行,在她呼叫exec或_exit之後 父程序才可能被排程執行。如果在呼叫這兩個 函式之前子程序依賴於 父程序的進一步動作,則會導致死鎖。

4.當需要改變共享資料段中變數的值,則拷貝父程序。

#include

#include

#include

#include

int globalvar =6;

intmain()

else

if(pid==0)

// parent continues here

printf

("pid = %ld,glob = %d , var=%d\n",(

long

)getpid()

,globalvar,var)

;exit(0);}

無需對父程序呼叫sleep,因為子程序呼叫exec或exit前,核心使父程序休眠。

第五章 程序 函式exec函式族

exec函式是提供fork建立新的執行緒後,執行外部程式的乙個介面,當程序呼叫一種exec函式時,該程序執行的程式完全替換為新程式,且從新程式的main函式開始執行。因為exec不建立新的程序,所以前後的程序id不變。int execl const char path,const char arg0...

第五章 函式

第五章 函式 1 函式的定義 shell函式定義可以放在 bash profile 檔案中,也可以在使用該函式的指令碼中,還可以在命令列中 通過 source 或 執行bash profile檔案,使修改能夠立即生效 function 函式名 declare f 顯示定義的函式清單 export f...

第五章 函式

在lua中,函式是對語句和表示式進行抽象的主要機制。即使呼叫函式時沒有引數,也必須要寫出一對空括號。一種特殊的例外情況 乙個函式若只有乙個引數,且此引數是乙個字面字串或table構造式,那麼圓括號別是可有可無的。print hello world dofile test.lua print a mu...