APUE 第三章 檔案I O

2021-08-27 12:18:19 字數 1659 閱讀 9379

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