虛擬文件系統中的數據結構(fs_struct、files_struct)

虛擬文件系統中的數據結構(fs_struct、files_struct)   

虛擬文件系統中的數據結構(fs_struct、files_struct) - xd03071149 - xd03071149的博客
1、與進程相關的文件
首先,文件必須由進程打開,每個進程都有它自己當前的工作目錄和它自己的根目錄。task_struct的fs字段指向進程的fs_struct結構,files字段指向進程的files_struct結構。
 
struct fs_struct {
 atomic_t count;
 rwlock_t lock;
 int umask;
 struct dentry * root, * pwd, * altroot;
 struct vfsmount * rootmnt, * pwdmnt, * altrootmnt;
};
 

其中:
count:共享這個表的進程個數
lock:用於表中字段的讀/寫自旋鎖
umask:當打開文件設置文件權限時所使用的位掩碼
root:根目錄的目錄項
pwd:當前工作目錄的目錄項
altroot:模擬根目錄的目錄項(在80x86結構上始終爲NULL)
rootmnt:根目錄所安裝的文件系統對象
pwdmnt:當前工作目錄所安裝的文件系統對象
altrootmnt:模擬根目錄所安裝的文件系統對象(在80x86結構上始終爲NULL)

第二個表表示進程當前打開的文件,表的地址存放於進程描述符task_struct的files字段。該表的類型爲files_struct結構:

struct files_struct {
 atomic_t count;
 struct fdtable *fdt;
 struct fdtable fdtab;

 spinlock_t file_lock ____cacheline_aligned_in_smp;
 int next_fd;
 struct embedded_fd_set close_on_exec_init;
 struct embedded_fd_set open_fds_init;
 struct file * fd_array[NR_OPEN_DEFAULT];
};
struct fdtable {
 unsigned int max_fds;
 int max_fdset;
 struct file ** fd;      /* current fd array */
 fd_set *close_on_exec;
 fd_set *open_fds;
 struct rcu_head rcu;
 struct files_struct *free_files;
 struct fdtable *next;
};
#define NR_OPEN_DEFAULT BITS_PER_LONG
#define BITS_PER_LONG 32  /* asm-i386 */

 

fdtable結構嵌入在files_struct中,並且由它的fdt指向。

fdtable結構的fd字段指向文件對象的指針數組。該數組的長度存放在max_fds字段中。通常,fd字段指向files_struct結構的fd_array字段,該字段包括32個文件對象指針。如果進程打開的文件數目多於32,內核就分配一個新的、更大的文件指針數組,並將其地址存放在fd字段中,內核同時也更新max_fds字段的值

對於在fd數組中所有元素的每個文件來說,數組的索引就是文件描述符(file descriptor)。通常,數組的第一個元素(索引爲0)是進程的標準輸入文件,數組的第二個元素(索引爲1)是進程的標準輸出文件,數組的第三個元素(索引爲2)是進程的標準錯誤文件。請注意,藉助於dup()、dup2()和fcntl()系統調用,兩個文件描述符可以指向同一個打開的文件,也就是說,數組的兩個元素可能指向同一個文件對象。當用戶使用shell結構(如2>&1)將標準錯誤文件重定向到標準輸出文件上時,用戶也能看到這一點。

進程不能使用多於NR_OPEN(通常爲1 048 576)個文件描述符。內核也在進程描述符的signal->rlim[RLIMIT_NOFILE]結構上強制動態限制文件描述符的最大數;這個值通常爲1024,但是如果進程具有超級用戶特權,就可以增大這個值。

發佈了5 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章