fork函式通過拷貝當前程序建立乙個子程序。
在fork之前,我們先了解一些別的知識。傳統的fork系統呼叫直接把所有的資源複製給新建立的程序。這種實現過於簡單並且效率低下,因為它拷貝的資料也許並不共享,更糟的情況是,如果新程序打算立即執行乙個新的映像,那麼所有的拷貝都將前功盡棄。linux的fork使用寫時拷貝頁實現。
寫時拷貝:寫時拷貝是一種可以推遲甚至免除拷貝資料的技術。核心此時並不複製整個程序位址空間,而是讓父程序和子程序共享同乙個拷貝。只有在需要寫入的時候,資料才會被複製,從而使各個程序擁有各自的拷貝。
fork函式:乙個現有程序可以呼叫fork函式建立乙個新程序
返回值:子程序中返回0,父程序中返回子程序id,出錯返回-1
由fork建立的新程序被稱為子程序。fork函式被呼叫一次,但返回兩次。兩次返回的唯一區別是子程序的返回值為0,而父程序的返回值則是新子程序的程序id。將子程序id返回給父程序的理由是:因為乙個程序的子程序可以有多個,並且沒有乙個函式使乙個程序可以獲得其所有子程序的程序id。fork使子程序得到返回值0的理由是:乙個程序只會有乙個父程序,所以子程序總是可以呼叫getppid以獲得其父程序的程序id。
我們使用乙個程序演示
先宣告變數後父子程序都使用,可以成功就是因為寫時拷貝。
因為fork返回給父子程序的pid變數不同,所以可以通過pid的值來區分父子程序。父程序執行7次,子程序執行3次。
使用sleep讓程式沉睡一秒,體現父子程序的併發執行。
Linux中fork 系統呼叫函式
什麼是fork 呼叫fork 發生了什麼 子程序建立後,系統會給子程序分配資源,然後把原來的程序的所有值都複製到新的子程序中,只有少數值與原來的程序的值不同 其實就是父程序的乙份副本。但是子程序和父程序駐留在不同的記憶體空間上。這些記憶體空間具有相同的內容,並且乙個程序執行的任何操作都不會影響其他程...
通過fork函式解讀linux系統行緩衝與全緩衝
基於流的操作最終會呼叫read或者write函式進行i o操作。為了使程式的執行效率最高,流物件通常會提供緩衝區,以減少呼叫系統i o庫函式的次數。1 全緩衝 全緩衝指的是系統在填滿標準io緩衝區之後才進行實際的io操作 注意,對於駐留在磁碟上的檔案來說通常是由標準io庫實施全緩衝。2 行緩衝 在這...
Linux下的fork 函式
fork fork的英文翻譯是 分叉 同樣在linux中我們也可以理解為如果使用了fork 函式,程序也會 分叉 下面進行具體的說明fork 函式。定義 通過系統呼叫建立乙個與原程序幾乎完全相同的程序,其中新產生的程序成為子程序。原型 pid t fork void fid t相當於int型別特殊之...