Linux Linux檔案與程序的關聯

2021-08-22 06:16:46 字數 3727 閱讀 3309

作為檔案的使用者,程序理所當然地將要使用的檔案記錄於自己的控制塊。另外,由於程序所對應的程式也是乙個檔案,因此程序控制塊還必須記錄這個檔案的相關資訊。由於作業系統要對系統所以程序提供服務,因此作業系統還要維護乙個記錄所有程序開啟檔案的總表。

如果說檔案管理系統是檔案的管理者與提供者,那麼程序就是檔案系統中檔案的使用者。即,檔案管理系統與程序之間是服務與客戶之間的關係。

當程序通過系統呼叫open()開啟乙個檔案時,該系統呼叫找到這個檔案後,會把檔案封裝到乙個file結構的例項中提供給程序,這個例項稱為file物件。

file結構的定義如下:

struct file  f_u;

struct vfsmount *f_vfsmnt; //檔案目錄的vfs安裝點指標

struct dentry *f_dentry; //檔案的dentry

#define f_dentry f_path.dentry

#define f_vfsmnt f_path.mnt

const struct file_operations *f_op; //指向檔案操作函式集的這孩子很

spinlock_t f_lock; /* f_ep_links, f_flags, no irq */

atomic_long_t f_count; //記錄訪問本檔案的程序數目的計數器

unsigned int f_flags; //訪問型別

fmode_t f_mode; //訪問模式

loff_t f_pos; //檔案的當前讀寫位置

struct fown_struct f_owner;

const struct cred *f_cred; //id資訊

struct file_ra_state f_ra;

u64 f_version;

#ifdef config_security

void *f_security;

#endif

void *private_data;

#ifdef config_epoll

struct list_head f_ep_links;

#endif

#ifdef config_debug_writecount

unsigned long f_mnt_write_state;

#endif

};

其中,指標f_cred是記錄檔案所有者id,檔案所有者所在使用者組id的。其cred的結構如下:

struct cred ;
這就使得乙個檔案可能面臨三種使用者的訪問:檔案所有者、同組使用者、其他使用者。核心在處理乙個程序或使用者訪問某乙個檔案的請求時,要根據程序的uid、fid和訪問模式來確定該程序是否具有訪問這個檔案的許可權。對於乙個檔案的使用者來說,有讀、寫和執行三種檔案操作,因此形成了三種許可權,這三種許可權與三種使用者就共有9種組合,即檔案的訪問許可權可以用9個二進位制來表示,並將其儲存在檔案的dentry中。結構中的f_ops記錄了程序對檔案讀寫位置的當前值,它可以通過呼叫函式llseek()進行移動。值得注意的是,結構體中的指標f_op指向結構file_operations,該結構中封裝了對於檔案進行操作函式。該結構在檔案include/linux/fs.h的定義如下:

struct file_operations ;
從結構中可以看到,結構中是一系列函式的指標,這裡有熟悉的read()、write()、open()、close()等函式的指標。程序就是通過呼叫這些函式來訪問乙個檔案的,所以有人說file_operations結構是linux虛擬檔案系統與程序之間的主要介面。

弄清楚了系統管理file物件的方法之後,下面就進一步介紹每個程序對它自己訪問的file物件的管理方法。

linux用乙個陣列來管理程序開啟的檔案的file物件,陣列中的每乙個元素都存放在乙個指向程序所開啟的檔案的file物件。既然用乙個陣列來存放file物件,那麼用陣列的下標來訪問檔案就是乙個順理成章的方法,於是linux就把陣列元素的下標叫做該陣列元素所對應的檔案的檔案描述符,該描述符就是系統對檔案的標識,這個陣列也叫做檔案描述符陣列,其示意圖如下:

核心通過呼叫系統呼叫函式dup()、dup2()和fctl()可以使陣列中的多個元素指向同乙個檔案的file物件。也就是說,在linux中,同乙個檔案可以有多個檔案描述符。

前面看到,檔案描述符陣列中存放了乙個程序所訪問的所有檔案,把這個檔案描述符陣列和這個陣列在系統中的一些動態資訊組合在一起,就會形成乙個新的資料結構——程序開啟檔案表。

程序開啟檔案表files_struct結構在檔案include/linux/fdtable.h中的定義如下:

struct files_struct ;
顯然,這個結構應該屬於程序的資料,所以程序控制塊用指標files指向它。

struct task_struct
程序與其開啟檔案之間的關係如下圖所示:

因為程序對於的程式也是乙個檔案,這個檔案的位置在哪呢?

程序在檔案系統所在的位置叫做程序與檔案系統的關係。linux用結構fs_struct來描述程序在檔案系統中的位置。結構fs_struct在檔案include/linux.fs_struct.h中的定義如下:

struct fs_struct ;
其中,pwd指向程序的當前所在目錄;root指向程序的根目錄;altroot是程序的替換目錄。如下所示:

另外三個指標rootmnt、pwdmnt和altrootmnt則對應地指向上面三個目錄的結構vfsmount,該結構存放了目錄的一些安裝資訊。

作為檔案物件的提供者,作業系統必須對已經開啟和使用過後已被關閉的檔案進行記錄。核心通過維護兩個雙向迴圈鍊錶來管理這些被開啟的檔案和被關閉的檔案:乙個專門記錄開啟檔案,另乙個專門記錄關閉檔案。凡是file物件的f_count域不為null的檔案,都被鏈入開啟系統檔案鍊錶;而為null的檔案,都被鏈入系統關閉檔案鍊錶。

當vfs需要乙個file物件時,將呼叫函式get_empty_file()優先在系統關閉檔案鍊錶中摘取,如果鍊錶中file物件的數目已經為限制的底線nr_reserved_files,則系統就另行分配file物件所需要的記憶體空間。

總結起來,就是:

linux linux程序指令

1.linux有哪些程序 linux下的主要程序狀態有 2.1 r task running 可執行狀態 通過將程序的task struct結構放到cpu的可執行佇列中,使程序變成r態。只有處在該狀態的程序才有可能被程序排程器選中在cpu上執行 2.2 s task interruptible 可中...

linux linux程序記憶體分析

在產品的開發中,通過對當前系統消耗記憶體總量的統計,可以對產品所需記憶體總量進行精確的評估,從而選擇合適的記憶體晶元與大小,降低產品的成本。在遇到記憶體洩露類問題時,經常會對此束手無策,本文通過對proc下程序相關的檔案進行分析,精確評估系統消耗記憶體的大小,還可以對記憶體洩露類問題的解決提供一種定...

Linux linux程序間通訊

程序間通訊是指在不同程序之間傳播或交換資訊 程序間通訊可分為以下幾類 管道 匿名管道和命名管道 system ipc 訊息佇列 用於資料傳輸 共享記憶體 用於資料共享 訊號量 用於事件通知 posix ipc 訊息佇列 共享記憶體 互斥量條件變數 訊號量讀寫鎖 主要介紹常用的如管道 訊息佇列 訊號量...