linux VFS 之六 程序與檔案系統的關聯

2021-06-21 16:06:21 字數 1984 閱讀 1494

1、、檔案物件是在檔案被開啟的時候,由程序建立的,由乙個file結構來描述,檔案結構也僅僅存在於記憶體中。

2、檔案物件中存了乙個重要資訊:檔案指標(檔案當前位置),幾個程序可能同時訪問同一檔案,因此檔案指標必須存放在檔案物件,而非索引節點。 這也是為什麼乙個檔案被開啟一次,就要建立一次檔案物件。

3、使用dup(), dup2(), fcntl() 兩個檔案描述符可以指向同乙個開啟的檔案物件

struct task_struct ; */};

程序利用files_struct結構體與開啟的檔案物件進行關聯,如下:

/** open file table structure

*/struct files_struct ;

struct fdtable ;

下面舉為init task程序定義的全域性init_files,說明該結構體中幾個指標的初始化:

struct files_struct init_files = ,

.file_lock = __spin_lock_unlocked(init_task.file_lock),};

注:其他程序的files_struct應該是fork時copyinit_files而來。看如下呼叫關係:

do_fork=》copy_process=》copy_files=》dup_fd

/kernel/fs/file.c

/*分配乙個檔案描述符fd : start從哪開始,一般是0 */

int alloc_fd(unsigned start, unsigned flags) *

/ __set_open_fd(fd, fdt);  //更新fd在open_fds所對應的bit。

error = fd;        //new fd

out:

spin_unlock(&files->file_lock);       //釋放鎖

return error;        //最後返回新分配的fd

}好了,有函式alloc_fd的注釋,看一下面幾個用到的函式就很容易理解了。

int expand_files(struct files_struct *files, int nr)

static int expand_fdtable(struct files_struct *files, int nr)

static struct fdtable * alloc_fdtable(unsigned int nr)

struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)

注:使用dup(), dup2(), fcntl() 兩個檔案描述符可以指向同乙個開啟的檔案物件。即:

陣列fd_array的兩個元素可能指向同乙個檔案物件。下面看看dup是如何實現的:

fs/fcntl.c

syscall_define1(dup, unsigned int, fildes)

return ret;}

/kernel/fs/

file_table.c

void __init files_init(unsigned long mempages)

struct file *fget(unsigned int fd)

void fput(struct file *file)

struct file *alloc_file(struct path *path, fmode_t mode,const struct file_operations *fop)

struct file *get_empty_filp(void)

好啦,相信這些對理解vfs是非常有意義的!

Linux檔案系統型別與Linux VFS

linux 有著極其豐富的檔案系統,大體上可分如下幾類 磁碟檔案系統 指本地主機中實際可以訪問到的檔案系統,包括硬碟,cd rom,usb儲存器,磁碟陣列等。如fat16 fat32 ext3 ext4等 網路檔案系統 可以遠端訪問的檔案系統,這種檔案系統在伺服器端仍是本地的磁碟檔案系統,客戶機通過...

程序管理六(程序的同步與互斥三)

雖然訊號量及其p v操作是一種既方便又有效的程序同步工具,但如果採用這種同步機制來編寫併發程式,對於共享變數及訊號量變數的操作將被分散與各個程序中,有如下缺點 a.程式易讀性差。因為要了解對於一組共享變數及訊號量的操作是否正確,則必須通讀整個系統或者併發程式。b.不利於修改和維護。因為程式的區域性性...

linux分享六 nohup與 ,守護程序

contab每秒執行指令碼,然後將把標準錯誤重定向到標準輸出 2 1 以追加的方式寫入log cronjob.txt。補充 試想2 1代表什麼,2與 結合代表錯誤重定向,而1則代表錯誤重定向到乙個檔案1,而不代表標準輸出 換成2 1,與1結合就代表標準輸出了,就變成錯誤重定向到標準輸出。另外,使用n...