一:fork函式
乙個執行中的程序可以呼叫fork
函式來產生乙個新的程序,函式原型及標頭檔案定義如下:
#include
pid_t fork(void);
returns: 0 in child, process id of child in parent, 1 on error
下面有幾個細節性問題來說明:
1:普通的函式被呼叫時會有一次返回,
fork
函式會有
兩次返回。在程序中返回0
,在父程序中返回子程序的
pid。
2:子程序和父程序都會執行
fork
後面的指令,即
fork
以前的指令,子程序不會執行。
3:歷史上,子程序是父程序的拷貝。目前的
fork
實現不會完全賦值父程序的資料、堆、棧,因為
fork
通常後面會跟著
exec
函式。而是利用
copy-on-write(cow)
技術來實現,這些區域為子程序和父程序所共享,由核心來改變保護模式,從而實現資料的唯讀。當有程序試圖修改這些區域的資料時,核心僅僅做乙個這個要修改區域的賦值。
4:子程序提前與父程序執行或者是相反,這要取決的系統的排程策略。
fork下的檔案共享
利用fork
呼叫時,子程序會複製父程序所有的檔案描述符。在父程序和子程序共同寫入乙個檔案時,如果沒有同步機制,比如
wait
。那麼結果是兩者的寫入資料混合在一塊。
對於呼叫fork
後的檔案描述符操作,有以下兩點
1:父程序等待子程序結束。父程序不對描述符程序操作。當子程序結束時,任何子程序讀寫的共享檔案,都會更新檔案偏移。
2:如果,父程序關閉了,乙個共享的檔案描述符,則在子程序中,同樣被關閉。
以下為乙個程序間操作檔案的例子:
在@1中,在子程序中設定fd的lseek值為7。
在@3中,在父程序讀取fd的值。 在
@2中設lseek的第二個引數為7,結果如下:
create success,content:hello linux.i am li yachao.
file size is 28
in the child set the lseek is 7
parent read 21 byttes,content:inux.i am li yachao. 在
@2中設lseek的第二個引數為0,結果如下:
create success,content:hello linux.i am li yachao.
file size is 28
in the child set the lseek is 0
parent read 28 byttes,content:hello linux.i am li yachao.
從以上可以看出,和程序間操作變數不同,在子程序中操作父程序的檔案描述,會影響到父程序的操作。
總結:在fork
下,子程序和父程序共享同樣的檔案描述符,任何程序對於檔案描述符的操作都會影響到其他程序對於檔案描述符的操作。
二:vfork函式
vfork函式的呼叫和返回值和
fork
函式的相同,不同的是,
vfork
函式目的為生成乙個新的程序,新的程序用
exec
來執行乙個新的程式。
vfork函式有以下特點:
1:在呼叫
vfork
後,子程序僅僅呼叫
exec。
2:在子程序呼叫
exit
或者是exec
之前,子程序執行在父程序的位址空間。
3:子程序優先執行,直到呼叫
exit
或者是呼叫
exec
時,父程序才執行。
fork程序控制
完整了解unix程序控制是十分重要的。對我們而言,必須熟練掌握的幾個函式 fork,exec系列,exit,wait和waitpid waitpid可以等待乙個特定程序的結束 wait相當於 waitpid 1,status,0 關於fork 如果子程序在父程序之前終止,父程序可以通過wait或者w...
程序控制之fork函式
乙個現有程序可以呼叫fork函式建立乙個新程序。include pid t fork void 返回值 子程序中返回0,父程序中返回子程序id,出錯返回 1 由fork建立的新程序被稱為子程序 child process fork函式被呼叫一次,但返回兩次。兩次返回的唯一區別是子程序的返回值是0,而...
Unix 程序控制
一 程序 程序id為1是init程序,在自舉過程結束時由核心呼叫。程序id為2是頁精靈程序,此程序負責支援虛存系統的請頁操作。也是核心程序。二 fork 對於父程序已經終止的所有程序,它們的父程序都改變為init程序,我們稱這些程序由init程序領養。此保證了每個程序有乙個父程序。init被編寫成只...