linux對檔案操作有open、read、write、close、lseek,這些api都是不帶緩衝的函式,相對於c庫,這些可移植的api內部實現是有緩衝區的。
int open(char* pathname, int flag, …);
int read(int fd, void* buf, size_t size);
int write(int fd, void* bud, size_t size);
off_t lseek(fd, off_t offset, int whence);
int close(int fd);
當乙個程序終止的時候,作業系統會釋放 分配的記憶體和關閉開啟的檔案描述符。
off_t 可以是4個位元組或者是8個位元組,可以設定巨集_file_offset_bits設定為64位
來支援開啟的檔案超過2g。
open的時候 flag中有o_creat 標誌,當檔案不存在會建立檔案,存在不報錯。
讀寫i/o的效率(regular file)一般都是檔案所在分割槽的blocksize作為一次讀寫操作的緩衝區的大小,這樣效率是最高的,需要的時候是最少的[l1]。
檔案共享:
三個表項分別是程序記錄項、檔案表項、檔案對應的v節點
其中程序記錄項中有兩項:
檔案描述符標誌:對於每乙個fd都有自己的檔案描述符標誌
指向檔案表項指標:不同的檔案描述符可能一樣,比如dup函式,複製出來的描述符共享檔案表項,但是檔案描述符可以不同。fork子程序的時候,父子程序共享同乙個檔案表項
檔案表項:
檔案狀態標誌:是檔案開啟的時候的標誌,可讀、可寫、可讀寫…
當前檔案偏移:是這個檔案當前獨到**(lseek可以檢視)
系統v節點:指向系統v節點指標
v節點資訊:
v節點包含對檔案操作的核心呼叫介面,比如你對乙個描述符呼叫read的時候會從使用者態進入到核心態,把使用者態傳入的引數,轉交給核心態對應read的引數,指向核心態的函式,這些函式才是和檔案系統打交道的。
i節點,一般包含檔案的所有者、檔案長度、檔案所在裝置。。。(stat可檢視)
注意檔案描述符標誌和檔案狀態標誌在作用域方面的區別,前者僅僅適用乙個程序的乙個描述符,而後者適用於指向該給定檔案表項的任何程序中的描述符(父子程序共享)。
int dup(int fd);
int dup2(int fd, int fd2);
dup2如果fd2存在,就關閉這個描述符,如果不存在就適用fd2作為賦值的結果,如果fd ==fd2就直接返回fd。
dup、dup2共享乙個檔案表項。但是新複製出來的描述符的標誌和原來的可以不一樣。
強大的fcntl:
int fcntl(int fd, int cmd,…)
1複製現有的描述符(cmd=f_dupfd)共享同乙個檔案表項
2獲取或設定檔案描述符標誌(cmd=f_getfd、cmd= f_setfd)
3獲取或設定檔案狀態標誌(cmd = f_getfl、cmd=f_setfl)
4獲取或設定非同步i/o所有權(cmd=f_getown、cmd=f_setown)
5 獲取或設定記錄鎖(cmd=f_getlk、cmd=f_setlk、cmd=f_setlkw)
apue學習筆記(第三章 檔案I O)
本章開始討論unix系統,先說明可用的檔案i o函式 開啟檔案 讀寫檔案等 unix系統中的大多數檔案i o只需用到5個函式 open read write lseek以及close open函式 返回乙個最小的未用描述符 include int open const char pathname,i...
APUE學習筆記 第三章 檔案I O
apue學習筆記 第三章 檔案i o 1 函式open和openat 呼叫open或openat函式可以開啟或建立乙個檔案 includeint open const char path,into flag,mode t made int openat int fd,const char path,...
第三章 檔案I O
include int open const char pathname,int oflag,mode t mode 成功返回檔案描述符,出錯返回 1 oflag 可多選 o rdonly 唯讀 o wronly 只寫 o rdwr 讀 寫 mode o creat 檔案不存在則建立 o excl ...