linux
支援在不同程序間共享開啟檔案。為了說明檔案共享,先來說明核心用於所有
i/o的資料結構。
:(1)
inode(
i節點):
儲存乙個檔案的通用資訊,每個
inode
有乙個inode number
,在檔案系統中,乙個
inode number
能夠唯一地標識乙個檔案。
(2)
dentry(目錄項物件):每個
dentry
代表路徑中的乙個特定部分。
儲存乙個目錄的鏈結資訊
。個人理解:
描述乙個檔案和乙個名字
的對應關係。
(3)
file(檔案物件):
儲存乙個開啟的檔案與乙個程序的關係
,檔案物件表示程序已經開啟的檔案
在記憶體中的表示,該物件不是物理上的檔案。它是由相應的
open()
系統呼叫建立,由
close()
系統呼叫銷毀
(只有其引用計數為0
時才銷毀)
。多個程序可以開啟和操作同乙個檔案,所以同乙個檔案也可能存在多個對應的檔案物件。
它即為apue
中所說的「目錄表項」,內涵檔案偏移等資訊。
(1)
files_struct
:每個程序用乙個
files_struct
結構來記錄檔案描述符的使用情況,多寶
這個結構稱為使用者開啟檔案表
(含有描述符表)
。它是程序的私有資料。
它即為apue
中的「開啟檔案描述符表」。
(2)
fs_struct
:fs_struct
結構描述程序與檔案系統的關係。
這些物件的關係如下圖所示。
再來看一下apue
中描述的關於檔案和程序的關係,如下圖(
圖3-1
)顯示了程序的三張表之間的關係。該程序有兩個不同的開啟檔案
—乙個檔案開啟為標準輸入
(檔案表述符
0),另乙個開啟為標準輸出
(檔案描述符1)。
(1)每個程序在程序表中都有乙個記錄項
(開啟檔案描述符表)
,記錄項中包含有一張開啟檔案的描述符表,可將其視為乙個向量,每個描述符占用一項。
每個檔案描述符相關連的是: ·
檔案描述符標誌
(close_on_exec)。
· 指向乙個檔案表項的指標。
註解:這裡描述的即為linux
程序描述符(
tast_struct
)中的files
(files_struct
型別)。
(2
)核心為所有開啟檔案維持一張檔案表。每個
檔案表項
包含:
· 檔案狀態標誌(包含讀寫,填寫,同步,非阻塞等) ·
當前檔案偏移量 ·
指向該檔案
v節點表項的指標。
註解:這裡描述的「檔案表項」即為linux
系統下的檔案物件(
file
)。(3
)每個開啟的檔案都有乙個
v節點結構。
v節點包含了檔案型別和對此檔案進行各種操作的函式的指標。對於大多數檔案,
v節點還包括了該檔案的
i節點。這些資訊是再開啟檔案時從磁碟上讀入記憶體的。這些檔案都是從磁碟讀入記憶體的,所以可以快速使用這些引數。
註解:這裡描述的v
節點,在
linux
中即為i
節點,對應
inode
物件。
之後我們的討論也主要圍繞這三大物件。
在我們討論的幾個和檔案有關的物件中都存在引用計數,而他們的含義各不相同,理解這些引用計數對我們下面的討論至關重要。
(1)
file_struct引用計數:表明共享此結構的程序(執行緒)數。(我們討論執行緒共享檔案會用到)
(2)
fs_struct引用計數:表明共享此結構的程序(執行緒)數。(我們討論執行緒共享檔案會用到)
(3)
file物件引用計數:
開啟檔案引用計數
,引用這個file
物件描述符數。(
dup和
fork
都會增加這個計數,第一次
open
會使此計數為1,
close
會減小此計數,為
0時銷毀
file
物件)
(4)
dentry引用計數:每乙個計數對應乙個
file
物件。(5)
inode引用計數:每乙個計數對應乙個
dentry。
擴充套件:
(1
)close_on_exec
標誌從圖中可見,這個標著在程序的files_struct
中,是乙個程序所有檔案描述符(檔案控制代碼)的
位圖標誌
,每個位元位
對應乙個開啟的檔案描述符,用於確定在呼叫系統呼叫execve()
時需要關閉的檔案
描述符,可用fcntl
設定。
(2)附錄:i
節點結構
struct dinode
;
Linux程序 2 殭屍程序與檔案共享
孤兒程序 如果父程序先退出,子程序還沒退出那麼子程序成為孤兒程序,此時子程序的父程序將變為init程序 託孤給了init程序 注 任何乙個程序都必須有父程序 生成孤兒程序 int main int argc,char argv exit 0 殭屍程序 如果子程序先退出,父程序還沒退出,那麼子程序必須...
linux系統程式設計之程序(一) 程序與程式
mickole 出處 本節目標 一,什麼是程式?程式是完成特定任務的一系列指令集合 二,什麼是程序?三,程序資料結構 程序的靜態描述 由三部分組成 pcb 有關程式段和該程式段對其進行操作的資料結構集。程序控制塊 pcb 用於描述程序情況及控制程序執行所需的全部資訊,是作業系統用來感知進存在的乙個重...
linux系統程式設計之程序(一) 程序與程式
本節目標 一,什麼是程式?程式是完成特定任務的一系列指令集合 二,什麼是程序?三,程序資料結構 程序的靜態描述 由三部分組成 pcb 有關程式段和該程式段對其進行操作的資料結構集。程序控制塊 pcb 用於描述程序情況及控制程序執行所需的全部資訊,是作業系統用來感知進存在的乙個重要資料結構。段 是程序...