程序是通過檔案描述符(file descriptor,fd)來通路檔案的,每個程序最多能同時使用NR_OPEN個檔案描述符,這個值在include/linux/limits.h中定義為1024。每一個程序用一個打開檔案表files_struct來描述程序的檔案描述符使用情況。每一個檔案都有一個檔案指針。
程序的task_struct中有檔案系統相關的資料成員:
結構fs_struct給出了與程序相關的檔案系統的資訊,比如程序自己的目前工作目錄,它的根目錄等,這個結構的定義為:
其中path結構的root和pwd兩個成員分别描述了程序最常用到的兩個目錄的資訊,即根目錄和目前目錄,path結構定義如下:
mnt:描述目錄所安裝的檔案系統對象
dentry:描述目錄的目錄項
還有一個表表示程序打開的檔案,即task_struct結構的files_struct類型的files字段。它給出了所有的程序描述符的使用情況,其file結構指針數組成員給出了檔案描述符的資訊,其定義如下:
在新的管理檔案描述符的無鎖模型中,鎖機制是基于RCU的。檔案描述表包含多個成員——fd sets(open_fds 和 close_on_exec, 檔案指針數組, 檔案描述符集和檔案指針數組的大小)。為了使更新在一個無鎖的讀者看來是原子的,則檔案描述符表的所有元素被放在一個單獨的結構——struct fdtable中。
即,fdtable結構是程序的檔案描述符表,其定義如下:
fd字段指向檔案對象指針數組。該數組的長度存放在max_fds中。通常,fd字段指向files_struct的fd_array字段,該字段包含32個檔案對象指針。如果程序打開的檔案數目多于32個,核心就配置設定一個新的、更大的檔案指針數組,并将其位址放在fd中,核心也同時更新max_fds字段的值。
對于在fd數組中有元素的每個檔案來說,數組的索引就是檔案描述符。Unix程序将檔案描述符作為主檔案辨別符。兩個檔案描述符可以指向同一個打開的檔案。
程序不能使用多于NR_OPEN個檔案描述符。open_fds字段最初包含open_fds_init字段的位址,open_fds_init表示目前已打開檔案描述符的位圖。max_fds字段存放位圖中的位數。
fd_set結構是檔案描述符集,它将同一種情況下的多個檔案描述符放在一起。在include/linux/types.h有中定義:
typedef __kernel_fd_set fd_set;
__kernel_fd_set結構在include/linux/posix_types.h中定義:
typedef struct {
unsigned long fds_bits [__FDSET_LONGS];
} __kernel_fd_set;
其中與__FDSET_LONGS有關的一些宏:
embedded_fd_set結構是小的檔案描述符集,它将同一情況下的檔案描述符放在一起,隻能存放unsigned long類型位數個檔案描述符,不過,這對于許多程序已經足夠了。