fork和vfork同樣可以建立子程序,但fork會把父程序的資源做拷貝,而vfork會直接在父程序的位址空間中執行。
但是fork也有共享的內容,比如檔案描述符的檔案表,父子程序的沒個相同描述符共享同乙個檔案表,因此,父、子程序對同一檔案使用相同的檔案位移向量。
乙個程序可以有多個子程序,但只能有乙個父程序,所以fork和vfork會把子程序的pid作為返回值。
vfork一般用於建立乙個新程序,再用新程序去exec乙個新的程式。(相比fork同樣的方法來說效率更高)
另外,fork在建立操作後,是父程序先執行還是子程序,是不確定的,所以需要相應的排程方法。而vfork在建立會保證子程序先執行,當子程序exec或者_exit後父程序才會被排程。(在vfork的子程序中要慎用exit,exit操作會執行關閉i/o等操作)
也因此,fork會出現父程序先結束的情況,這時候子程序會由init程序領養,每個程序終止的時候,核心都會去逐個檢查活動程序,以判斷它是否是要終止的程序的子程序,如果是,則把子程序的父程序id置為1(init程序id)。以保障每個程序都有父程序。
此外,fork的父程序需要即時**子程序的狀態,以避免出現僵死程序(就是那些ps時發現狀態為z的),這就用到wait和waitpid函式了,**可以得到子程序的資訊(包括程序id,終止狀態,cpu資訊),並且由核心去釋放子程序對系統資源的占用。(如果當時父程序是init時,核心會自動執行這一步)
說到**子程序,子程序結束時,核心會向父程序拋送sigchld訊號,這個訊號系統預設是sig_ign,所以在多程序操作時,需要去重寫sigchld的操作函式。
程序建立fork 和vfork
乙個現有的程序可以通過兩種方式建立乙個新的程序,下面詳細介紹兩種fork vfork 函式原型 man 手冊 include pid t fork void 描述 fork 以當前的程序為副本建立乙個新的程序,新建立的程序被稱為子程序,當前的程序被稱為父程序,父程序和子程序執行在各自的位址空間。返回...
程序建立函式fork與vfork
1.fork 1 函式的功能 建立乙個程序 2 函式的原型 pid t fork void 3 函式的返回值 0 出錯 0 子程序 0 父程序 其值為子程序的識別號 4 標頭檔案 include fork的奇妙之處在於它被呼叫一次,卻返回兩次,它可能有三種不同的返回值。include include...
程序建立之fork與vfork
由圖中的對映關係我們可以發現,虛擬位址與實體地址並不是一一對應的,這樣也就會出現一種問題,乙個變數位址相同內容不同,其實是虛擬位址相同,所對應的實體地址不同的原因 那麼是誰管理著虛擬位址空間呢?pcb中有mm strct管理虛擬位址空間 linux中絕大多數函式出錯返回值都是 1,函式出錯後將錯誤編...