Linux下的fork複製程序

2021-10-08 10:06:47 字數 1074 閱讀 3461

1.複製程序的概念

fork建立乙個程序時,子程序只是完全複製父程序的資源,複製出來的子程序有自己的task_struct結構和pid,同時複製父程序其它資源(使用者空間、檔案描述符集)。

2.複製程序的實現方式

當我們需要複製乙個程序時,我們就去呼叫fork()這這個函式,fork()這個函式就會去陷入核心去多複製乙個pid出來,此時這個pid下的程序執行的程式就是子程序的。

3.寫實拷貝

fork()是乙個開銷十分大的系統呼叫,這些開銷並不是所有的情況下都是必須的,比如某程序fork()出乙個子程序後,其子程序僅僅是為了呼叫exec執行另乙個可執行檔案,那麼在fork()過程中對於虛存空間的複製將是乙個多餘的過程。但由於現在linux中是採取了copy-on-write(cow寫時複製)技術,為了降低開銷,fork()最初並不會真的產生兩個不同的拷貝,因為在那個時候,大量的資料其實完全是一樣的。寫時複製是在推遲真正的資料拷貝。若後來確實發生了寫入,那意味著parent和child的資料不一致了,於是產生複製動作,每個程序拿到屬於自己的那乙份,這樣就可以降低系統呼叫的開銷。所以有了寫時複製。

4.fork()的返回值

fork()執行完成之後會有兩個返回值,其中父程序返回父程序的pid號,對於子程序,它會返回乙個零,這就是通過fork()來執行兩個程序的關鍵。

5.共享**段

在fork之後,子程序和父程序都會繼續執行fork()呼叫之後的指令。子程序是父程序的副本。它將獲得父程序的資料空間,堆和棧的副本,這些都是副本,父子程序並不共享這部分的記憶體。也就是說,子程序對父程序中的同名變數進行修改並不會影響其在父程序中的值。但是父子程序又共享一些東西,簡單說來就是程式的正文段。正文段存放著由cpu執行的機器指令,通常是read-only的。

6.fork()複製程序的程式驗證

#include

#include

#include

#include

#include

#include

intmain()

else

int i =0;

for(

;i)exit(3

);}

Linux中關於fork 複製程序

fork 複製程序1 fork 的基本概念 乙個現有程序可以用fork 函式通過系統呼叫建立乙個新程序,該函式定義如下 include pid t fork void 返回 若成功則在子程序中返回0,在父程序中返回子程序pid,若出錯則返回 1 因此,可以通過返回值知道當前程序是父程序還是子程序。2...

Linux程序管理 fork 和寫時複製

寫時複製技術最初產生於unix系統,用於實現一種傻瓜式的程序建立 當發出fork 系統呼叫時,核心原樣複製父程序的整個位址空間並把複製的那乙份分配給子程序。這種行為是非常耗時的,因為它需要 為子程序的頁表分配頁面 為子程序的頁分配頁面 初始化子程序的頁表 把父程序的頁複製到子程序相應的頁中 建立乙個...

Linux 程序建立 fork

1 fork 函式原型 pid t fork void 函式返回值型別為 pid t,實質是 int 型別,linux 核心2.4.0版本的定義是 typedef int kernel pid t typedef kernel pid t pid t 2 fork 函式的底層實現 fork vfor...