對於unix系統來說,一切皆檔案。但是常用的檔案io函式只有5個
本章主要介紹的是不帶緩衝的io,它是posix的組成部分,但不是iso c的組成部分。涉及到多個程序共享資源時,原子操作的概念就變得很重要,本章通過檔案io和open函式的引數討論相關概念。隨後會涉及到多程序如何共享檔案,以及核心相關的資料結構。最後介紹dup,fcntl,sync,ioctl函式。
對於核心來說,所有開啟的檔案都可以通過檔案描述符表示。檔案描述符是乙個非負整數,當開啟或者建立乙個檔案時,核心會向程序返回乙個檔案描述符,該檔案描述符還可以作為引數傳給read或者write。在shell中,0代表標準輸入,1代表標準輸出,2代表標準錯誤,使用posix標準時,可以用stdin_fileon,stdout_fileon和stderr_fileon表示,它們定義在中。檔案描述符的變化範圍是0~open_max-1。
//開啟檔案
#includeint open(const char* path,int flag,.../*mode_t mode*/);
int openat(int fd,const char* path,int flag,.../*mode_t mode*/);
path:
檔名flag:
o_rdonly 唯讀
o_wronly 只寫
o_rdwr 讀寫
o_exec 執行
o_search 搜尋(應用於目錄)
以上5中許可權能且只能指定乙個,下列是可選的。
o_excl(如果同時指定了o_create,檔案存在則出錯,檔案不存在則建立),
o_nonblock(如果path引用的是fifo,一塊特殊檔案或者字元特殊檔案,則本次開啟和後續的io操作均為非阻塞。)
o_sync,o_trunc,o_tty_init,o_dsync,o_rsync,o_noctty,o_nofollow。
fd: 1.path是絕對路徑時,fd被忽略,openat相當於open。
2.path是相對路徑,fd是通過開啟相對路徑名所在目錄獲取的,fd指出了相對路徑名在檔案系統的開始位址。
3.path是相對路徑,fd引數具有特殊值at_fdcwd,路徑名在當前工作目錄中獲取。openat和open類似。
return
成功: 檔案描述符,且該檔案描述符一定是最小未用的檔案描述符值。
失敗: -1
openat主要想解決兩個問題
1.執行緒可以使用相對路徑開啟目錄中的檔案,而不是只能開啟當前工作目錄。
2.避免tocttou錯誤。time-of-check-to-time-of-use。有兩個基於檔案的函式呼叫,
第二個呼叫依賴於第乙個呼叫的結果,那麼程式是不可靠的,因為兩個呼叫不是原子操作。
//建立新檔案
#includeint create(const char* path,mode_t mode);
//這個函式太羅嗦,現在已經被open取代,不再介紹
第3章 檔案I O
引言unix系統中的大多數檔案i o 只需要用到5個函式 open read write lseek以及close 檔案描述符 用於描述檔案開啟或者建立之後返回的乙個非負整數,可以理解為檔案的id 特殊用途的標號 0 標準輸入 1 標準輸出 2 標準錯誤 早期系統一般乙個程序最多開啟16個檔案,現在...
第3章 檔案I O
3.2 檔案描述符 對於核心而言,所有開啟的檔案都通過檔案描述符引用。檔案描述符時乙個非負整數。當開啟乙個現有檔案或建立乙個新檔案時,核心向程序返回乙個檔案描述符。當讀 寫乙個檔案時,使用open或creat返回的檔案描述符標識該檔案,將其作為引數傳送給read或write。按照慣例,unix系統s...
第3章 檔案I O
3.3 函式open和openat 呼叫open或openat函式可以開啟或建立乙個檔案。iinclude int open const char path,int oflag,mode t mode int openat int fd,const char path,int oflag,mode ...