open系統呼叫的服務例程是sys_open()函式,它接受三個引數:要開啟檔案的路徑名filename, 訪問模式的表示flags和檔案許可權掩碼mode。在核心中,sys_open實際呼叫do_sys_open函式來完成所有操作。
do_sys_open主要執行如下操作:
1,通過getname()從程序位址空間獲取該檔案的路徑名
2,呼叫get_unused_fd_flags(flags)函式從current->files結構中分配乙個空閒的fd。
3,呼叫do_filep_open(dfd, pathname, flags, mode, 0)找到檔案物件的指標struct file* f。
4,呼叫fd_install(fd, f),將f與fd關聯起來。實際是將f儲存在current->files->fdtab->fd陣列的第fd位置處。
do_filep_open函式的主要功能,就是通過路徑名來分配並填充這個檔案對應的檔案物件。
do_filep_open(dfd, pathname, flags, mode, acc_mode)函式主要執行如下操作:
1,設定一堆訪問模式標誌
2,呼叫get_empty_filep()函式從名為filp_cachep的slab快取中分配乙個struct file*的檔案物件。
3,如果flags中有o_create標誌,跳到,否則到4
4,呼叫do_path_lookup(dfd, pathname, flags, &nd)做目錄查詢,將查詢結果填充到struct nameidata *nd中。還記得目錄查詢麼?見這裡
5,呼叫finish_open(nd, flags, mode)做一些合法性驗驗證並從nd->intent.open.file中獲取到struct file* filep
6,呼叫release_open_intent(nd)做一些清理工作。主要是減少nd->intent.open.file中的一些引用計數。
7,返回filep
8,到這一步說明flags中有o_create標誌,需要在目錄查詢過程中逐級建立對應的目錄和檔案,這一步依次呼叫path_init_rcu(), path_walk_rcu()和path_finish_rcu()完成建立檔案的目錄查詢工作,最終依然是將查詢結果填充到struct nameidata *nd中。(在標準的目錄查詢do_path_lookup()的實現中,主幹流程也是依次呼叫著三個函式做查詢工作)
9,呼叫do_last(&nd, &path, flags, acc_mode, mode, pathname)函式獲取最終的struct file *filep結構。在這個函式中,核心會根據nd->last_type做不同的處理,對於普通檔案,會呼叫finish_open(nd, flags, mode)做一些合法性驗驗證並從nd->intent.open.file中獲取到struct file* filep
10,呼叫release_open_intent(nd)做一些清理工作。主要是減少nd->intent.open.file中的一些引用計數。
11,返回filep
核心源**中涉及到sys_open實現的檔案主要有fs/open.c fs/namei.c fs/compat.c fs/file.c fs/file_table.c等
目錄查詢在sys_open的實現中扮演著很重要的角色,struct file* filep中f_path和f_op的填充都是在目錄查詢階段做的。
open 系統呼叫的實現
open系統呼叫的服務例程是sys open 函式,它接受三個引數 要開啟檔案的路徑名filename,訪問模式的表示flags和檔案許可權掩碼mode。在核心中,sys open實際呼叫do sys open函式來完成所有操作。do sys open主要執行如下操作 1,通過getname 從程序...
creat 與open 系統呼叫
creat 建立檔案,顯然引數只需要 路徑path,許可權mode 1 如果檔案存在怎麼辦?直接覆蓋掉!不管你裡面有沒有內容。include include include includeusing namespace std int main 建立成功,但是有個問題。給的許可權八進位制777最大許...
檔案開啟時open系統呼叫
靈雲星火 1 檔案開啟時open系統呼叫 open建立了一條到檔案或裝置的訪問間的路徑。如果呼叫成功,它將返回乙個可以被read,write和其他系統呼叫使用的檔案描述符。這個檔案描述符是唯一的,它不會與任何執行的程式共享。如果兩個程式開啟聽乙個檔案,也返回不同的描述符。如果他們都對檔案進行寫操作,...