unix系統中的大多數文件I/O只需用到5個函數:open、read、write、lseek、close。
術語不帶緩衝指的是每個read和write都調用內核中的一個系統調用。
只要涉及在多個進程間共享資源,原子操作將會變得非常重要。
由open返回的描述符一定是最小的未用的描述符值。
int open(char* filename, int oflag, .../*mode*/);
我們將第三個參數寫爲...,ISO C用這種方法表明餘下的數量及其類型根據具體的調用會有所不同。
oflag常用參數
以下三個必須指定一個並且只能指定一個。
O_RDONLY 只讀
O_WRONLY 只寫
O_RDWR 讀寫
以下爲可選
O_APPEND 每次寫時都追加到文件尾端
O_CREATE 若文件不存在,則創建它。使用該選項時,需要第三個參數mode,用其指定新文件的權限訪問位。
O_EXCL 如果同時制定O_CREAT,而文件存在,則會出錯。用此可以測試一個文件是否存在,如果不存在,則創建此文件,這使創建和測試兩者稱爲一個原子操作。
O_TRUNC 如果此文件存在,並且以只寫或者讀寫成功打開後,將其長度截斷爲0。
更多選項可通過man 2 read查看。
int close(int fd);
1、關閉一個文件時,還會釋放該進程加在該文件上的所有記錄鎖。
2、當一個進程終止時,它所有打開的文件都會被內核關閉。
每個打開的文件都有一個與其相關聯的“當前文件偏移量”,它通常是一個非負整數,用以度量從文件開始處的字節數量。通常,讀、寫操作都從當前文件偏移量處開始,並使偏移量增加所讀寫的字節數。按系統默認的情況,當打開一個文件時,除非指定O_APPEND選項,否則該偏移量被設置爲0。
off_t lseek(int fd, off_t offset, int whence);
若whence是SEEK_SET,則將該文件的偏移量設置爲距文件開始處offset個字節。
若whence是SEEK_CUR,則將該文件的偏移量設置爲當前值加offset,offset可爲正或負。
若whence是SEEK_END,則將該文件的便宜兩設置爲文件長度加offset,offset可以爲正或負。
若lseek成功執行,則返回新的文件偏移量,爲此可以用下列方法確定打開文件的當前偏移量:
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
這種方法可以用來確定所涉及的文件是否可以設置偏移量。如果文件描述符引用的是一個管道、FIFO或網絡套接字,則lseek返回-1,並將errno設置爲ESPIPE。
lseek僅將當前的文件偏移量記錄在內核中,它並不引起任何I/O操作。然後,該偏移量用於下一個讀或寫操作。
文件偏移量可以大於文件的當前長度,在這種情況下,對文件的下一次寫將加長該文件,並在文件中構成一個空洞,這一點是被允許的。位於文件中但沒有寫過的字節都被讀爲0。
文件中的空洞並不要求在磁盤上佔用存儲區。具體實現方法和文件系統的實現有關,當定位到超出文件尾端之後寫時,對於新寫的數據需要分配磁盤塊,但是對原文件味道和新開始寫位置之間的部分則不需要分配磁盤塊。
文件I/O
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
異步信號安全(可重入性)與線程安全
julysee
2018-08-26 01:15:04
用creat創建已存在的文件會發生什麼
julysee
2018-08-26 01:15:04
errno的前世今生
julysee
2018-08-26 01:15:04
the data structures used by the kernel for all I/O
julysee
2018-08-26 01:15:00
UNIX Architecture
julysee
2018-08-26 01:14:26
【代碼】顯示一個目錄下所有文件
julysee
2018-08-26 01:14:26
在Linux環境下面搭建 UNIX 環境高級編程(第三版) 的代碼編譯環境
mrzhuyuanheng
2018-08-24 16:29:10
APUE學習--Ch.7 進程環境
autoxkc
2018-08-23 19:58:04
APUE學習——Ch2.Unix標準化與實現
autoxkc
2018-08-23 19:58:03
APUE學習——Ch1.UNIX基礎知識
autoxkc
2018-08-23 19:58:03
APUE學習——Ch4.文件和目錄
autoxkc
2018-08-23 19:58:00