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...