今日閱讀《unix環境高階程式設計2》才發現一些以前從未注意過的細節。
linux程式設計使用的open、close、read、write等檔案io函式屬於系統呼叫的,其實現方式是用了fctrl、ioctrl等一些底層操作的函式。而標準io庫中提供的是fopen、fclose、fread、fwrite等面向流物件的io函式,這些函式在實現時本身就要呼叫linux的檔案io這些系統呼叫。
在應用上,檔案讀寫時二者並沒區別,但是一些特殊檔案,如管道等,只能使用檔案io操作。檔案io的乙個方便之處在於,對於一切linux中的檔案物件,都可以操作,這也是linux把系統中所有資源,都對映成檔案節點的優越之處。另一方面,在一些應用中,如果需要格式化字串輸入輸出時,標準io提供了乙個很好的介面,fprintf(file* fp, char *platestr,...),而在檔案io中沒有這樣的函式,那麼如果我們按照習慣用open函式開啟了檔案,獲得檔案描述符fd,只要根據fd得到對應的標準io流的指標fp,就可以使用fprintf函式做格式化輸出了。
實現這個功能的函式就是 fdopen
標準io提供了3個開啟檔案流的函式
其中fopen是最長用的函式。
freopen的左右是在引數指定的流上開啟乙個檔案,若檔案已經開啟則先關閉該流;若檔案流已經定向,則清楚定向。此函式可以用於把指定的檔案開啟成為標準輸入輸出。
fdopen的作用是從現有的檔案描述符(從open、dup、fctrl、pipe、socket、accept等處獲得)開啟乙個流使其與該檔案描述符相關聯。利用這個函式就可以實現前面所說的對於一般的檔案io做格式化輸入輸出等標準io的操作。
需要注意的是,前兩個函式屬於iso c的標準,fdopen屬於posix.1的標準。iso c 的標準中沒有檔案描述符的概念。另外,fdopen的第二個引數與fopen的引數類似:
r/rb
w/wb
a/ab
r+ /r+b/rb+
w+/w+b/wb+
a+/a+b/ab+
區別是fdopen的引數中如果是二進位制檔案,需要指定b引數,因為iso c中是要區別二進位制檔案和文字檔案的的,而在linux核心中對二者沒有不同的待遇。另外,由於fdopen開啟的檔案是已經開啟過的,因此w引數並不會把檔案長度截斷為0,是否截斷取決於open引數中的o_trunc引數。所以每次fwrite寫入的資料都將寫入檔案尾。
以上就是從檔案符獲得檔案io流指標的方法。若我們先得到了檔案io流指標,再需要獲得檔案描述符,怎麼辦呢?因為所有的標準io的函式最終都要呼叫linux提供的檔案io這類系統呼叫,所以每個標準io流都必然關聯乙個檔案描述符,用這個函式就可以得到關聯的檔案描述符了
int fileno( file *fp);
返回值:與該流關聯的檔案描述符
linux檔案IO的系統IO和標準IO理解
儲存在硬碟等物理儲存器上的檔案如何進行讀取等操作?如果我們直接對其進行讀寫等操作,也是可以滴,不過這就需要很費時費力,需要對硬體的物理構造有清楚的了解,很明顯,這很影響開發效率。當然也不排除某些特殊場合需要用到,但是大多數情況下,這種 低階的 操作,早已經被人們開發出來的乙個叫做 作業系統 的東西給...
C標準庫I O和Linux檔案I O
c標準 i o庫函式在標頭檔案 stdio.h 中宣告,而 read write 等函式 檔案i o 在標頭檔案 unistd.h 中宣告 linux的訪問許可權分為 讀 寫 執行三種,可以使用ls l進行檢視 niesh niesh desktop ls lh 總用量 8.0k rw rw r 1...
語言 Linux下的檔案IO和標準IO
檔案io與標準io 1.檔案oi又稱為低磁碟io 遵循posix標準,標準io又稱為高磁碟io,遵循ansi c相關標準。linux中使用的的是glibc,它是標準c庫的超集,不僅包含ansi c中定義的函式,也包含posix標準中定義的函式。故而linux中檔案io和標準io都可以使用。2.標準i...