文件I/O

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。
文件中的空洞並不要求在磁盤上佔用存儲區。具體實現方法和文件系統的實現有關,當定位到超出文件尾端之後寫時,對於新寫的數據需要分配磁盤塊,但是對原文件味道和新開始寫位置之間的部分則不需要分配磁盤塊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章