APUE 學習筆記(二) 文件I/O

1. 文件I/O

對於內核而言,全部打開的文件都經過文件描述符引用, 內核不區分文本文件和二進制文件
open函數:O_RDONLY  O_WRONLY  O_RDWR
create函數:
close函數:關閉一個文件時還會釋放該進程加在該文件上的全部記錄鎖
lseek函數:顯式地爲一個打開的文件設置其偏移量
每一個打開的文件都有一個與其相關聯的 "當前文件偏移量",用以度量從文件開始處計算的字節數,一般,讀、寫操做都從當前文件偏移量處開始,並使偏移量增長所讀寫的字節數
文件偏移量能夠大於文件的當前長度,寫該文件會在文件中造成一個空洞, 文件中的空洞並不要求在磁盤上佔用存儲區
 
read函數: 實際讀到的字節數少於所要求讀的字節數 的狀況:
(1) 讀普通文件時,在讀要求字節數以前已達到了文件尾端,好比到達文件尾端以前還有30字節,而要求讀100字節, 那麼下一次read會返回30字節,再下一次返回0
(2) 當從終端設備讀時,一般一次最多讀一行
(3) 當 從網絡套字節讀時,網絡中的緩衝機制可能形成返回值小於所要求讀的字節數
(4) 當從管道或FIFO讀時,例如 管道包含的字節數少於所需的數量,那麼read將只返回實際可用的字節數
(5) 當某一信號形成中斷,而已經讀了部分數據量時
 
write函數:其返回值要與所寫的字節數相同,不然表示出錯
 

2.文件共享

內核使用三種數據結構來表示打開的文件
 
(1)每一個進程在進程表中都有一個記錄項,包含文件描述符表,有一個文件描述符標誌和 指向文件表項的指針
(2)內核爲全部打開文件維護一張文件表,包含 文件狀態標誌、 當前文件偏移量、指向該文件V節點表項的指針
(3)每一個打開文件都有一個v節點結構, Linux使用inode節點結構,記錄文件的元信息,對應於fstat函數
 
 
一個給定的文件只有一個v節點表項
每一個進程都有它本身對該文件的當前偏移量
 

3. dup和dup2函數:複製一個現存的文件描述符

函數返回的新描述符與輸入參數描述符共享同一個文件表項
 

4.fcntl函數

fcntl函數能夠改變已打開的文件的性質
int fcntl(int fd, int cmd, ...)
fcntl函數有5中功能:
(1)複製一個現有的描述符 (cmd = F_DUPFD)
(2)獲取/設置文件描述符標記 (cmd = F_GETFD, F_SETFD)
(3)獲取/設置文件狀態標誌 (cmd = F_GETFL, F_SETFL)
(4)獲取/設置異步I/O全部權 (cmd = F_GETOWN, F_SETOWN)
(5)獲取/設置記錄鎖 (cmd = F_GETLK, F_SETLK, F_SETLKW)
相關文章
相關標籤/搜索