fork()會產生乙個和父程序完全相同的子程序,出於效率考慮,linux中引入了「寫時複製「技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。在fork之後exec之前兩個程序用的是相同的物理空間(記憶體區),子程序的**段、資料段、堆疊都是指向父程序的物理空間,也就是說,兩者的虛擬空間不同,但其對應的物理空間是同乙個。
fork時子程序獲得父程序的pcb、資料段、堆疊的複製。如果不是因為exec,**段繼續共享父程序的物理空間(兩者的**完全相同)。而如果是因為exec,由於兩者執行的**不同,子程序的**段也會分配單獨的物理空間。
子程序從父程序繼承大多數的屬性,子程序有自己的pid,子程序的程序組id為父程序的id
fork 函式的特點是 "呼叫一次,返回兩次":在父程序中呼叫一次,在父程序和子程序中各返回一次。在父程序中返回時的返回值為子程序的 pid,而在子程序中返回時的返回值為 0,並且返回後都將執行 fork 函式呼叫之後的語句。如果 fork 函式呼叫失敗,則返回值為 -1。
使用 fork/vfork 建立子程序後執行的是和父程序相同的程式,子程序往往需要呼叫乙個 exec 族函式以執行另外乙個程式。程式呼叫 exec 的時候,該程序的使用者空間**和資料完全被新程式替換,從新程式的起始處開始執行。呼叫 exec 族函式並不建立新程序,所以呼叫 exec 族函式前後該程序的 pid 並不改變。
exec族函式配合fork函式使用
檔案demo.c include include include include include include include intmain if pid 0 else return0 檔案changdata.c include include include include include i...
fork程式設計之exec函式詳解
基本概念 用fork函式建立新的子程序後,子程序往往要呼叫一種exec函式以執行另乙個程式。當程序呼叫一種exec函式時,該程序執行的程式完全替換為新程式,而新程式則從其main函式開始執行。因為呼叫exec並不建立新程序,所以前後的程序id並未改變。exec只是用磁碟上的乙個新程式替換了當前程序的...
fork 函式 fork 函式的使用
fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...