linux程序系列 2 程序的繼承

2021-07-24 13:55:31 字數 1577 閱讀 2498

fork和vfork函式都是涉及到子程序是否複製父程序的虛擬記憶體空間的問題,這就是程序的繼承,下面我們就來討論一下父程序與子程序的繼承關係。

父程序建立出乙個子程序,子程序會繼承父程序的一些資訊,這些資訊我們稱之為子程序的繼承屬性,同時子程序也會有自己特有的屬性。

子程序從父程序繼承來的屬性主要有:

使用者資訊和許可權、目錄資訊、訊號資訊、環境(也就是環境變數,程序的環境變數儲存在環境表中,每個已經啟動的程序的環境表都是從父程序的環境表繼承下來的)、

共享儲存段、資源限制、堆、棧和資料段,共享**段(下文會有介紹)。

也就是說子程序把上述父程序的內容拷貝乙份作為自己使用,這些內容父程序中有乙份,子程序中也有

乙份。但是父程序中有些資訊是子程序是複製不了的,也就是屬於程序特有的資訊,不允許父程序建立的子程序進行複製。這些資訊我們稱之為程序特有屬性:

程序id、鎖資訊、執行時間、未決訊號。

子程序從父程序繼承而來的屬性中,虛擬記憶體空間(共享**段、資料段、堆、棧)的繼承比較複雜,對於fork、vfork linux有不同的虛擬記憶體空間繼承機制。下面的描述了fork建立的程序,父子程序間虛擬記憶體空間的繼承,

p1表示父程序,p2程序表示由p1fork出的子程序。

每個程序核心都會分配4g的虛擬空間,這4g的虛擬空間包含正文段(**段)、資料段、堆、棧。這些虛擬空間中的資料會最終對映到物理空間中去,物理空間也就是計算機的記憶體條。

虛擬空間各儲存段有各自對應的虛擬位址,這些虛擬位址對映到對應的的物理空間中的實體地址。當fork乙個子程序之後,核心也會為子程序分配4g的虛擬位址空間,並且核心會將父程序4g的虛擬空間中內容複製到子程序的4g的虛擬空間中,這樣一來父程序4g的內容與子程序4g的內容是一樣的。

對於**段,父程序中**段的內容與子程序**段的內容都是一樣的,父程序執行什麼樣的**,子程序也會執行什麼樣的**。那什麼是共享**段呢?父程序虛擬空間中的**段對映到的物理空間與子程序虛擬空間中的**段

對映到的物理空間是一樣的,這就是上面所說的**段共享。

但是父子程序其它的虛擬空間中的其它儲存段是不共享的,它們各自對映到自己的物理記憶體中去。

對於vfork函式建立乙個子程序,虛擬記憶體空間的繼承是這樣的:

也就是說子程序共享了父程序的虛擬記憶體空間。

這樣一來我們可以總結出,由fork建立的子程序,在子程序的資料段、堆、棧的記憶體空間(虛擬記憶體和物理記憶體)保留了父程序的原始資料,但是父子程序彼此修改自己的資料互不影響。而vfork建立的子程序完全共享父程序的記憶體空間(虛擬記憶體和物理記憶體),因此父子程序資料段、堆、棧中資料的修改會彼此受到影響。

另外父子程序,核心空間的繼承關係是這樣的,操作檔案時的核心結構變化:

子程序只繼承父程序的檔案描述符表,不繼承但共享檔案表項和i-node。

父程序建立乙個子程序後,檔案表項中的引用計數器加1變成2,當父程序做close操作後,計數器減1,子程序還是可以使用檔案表項,只有當計數器為0時才會釋放檔案表項。

linux程序系列 5 程序鏈與程序扇

在linux程式設計中我們或許需要建立多個程序才可以完成任務需求,那麼我們怎麼建立多個程序呢?下面我們介紹一下程序鏈與程序扇的概念 所謂程序鏈就是父程序建立乙個子程序,建立的子程序再次建立出屬於自己的子程序,這樣依次往下迴圈,如下圖所示。所謂的程序扇就是乙個父程序建立出多個子程序,如下圖所示。下面是...

linux程序系列 6 守護程序與孤兒程序

守護程序是生存期長的一種程序,它們常常在系統引導裝入時啟動,系統關閉時終止。守護程序有如下幾個特點 1.所有的守護程序都是以超級使用者 使用者id為0的root使用者 的優先權執行 2.守護程序沒有控制終端,一直在後台執行 3.守護程序的父程序都是init程序 1號程序 什麼是孤兒程序呢?父程序結束...

Linux 程序的概念2

include include int main 以上述 為例 pid t pid fork pid t其實就是乙個int型別的變數,用來表示程序的id,fork 返回乙個程序id,這個程序id賦值給pid 這個語句複製呼叫程序 父程序 建立了乙個新的程序 子程序 父程序在建立子程序成功後,程式計數...