Linux檔案共享(一) 程序與開啟檔案

2021-06-22 05:11:51 字數 3220 閱讀 9147

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 用於描述程序情況及控制程序執行所需的全部資訊,是作業系統用來感知進存在的乙個重要資料結構。段 是程序...