在了解檔案之前,我們顯然需要對本文討論的檔案所屬的範疇,即unix i/o有乙個大致的了解。
人們描述linux系統中時,往往伴隨著一句話:一切皆檔案
乙個linux 檔案就是乙個m個位元組的序列:
b0,b1,…,bk,…,bm-1
所有的i/о裝置(例如網路、磁碟和終端)都被模型化為檔案,而所有的輸人和輸出都被當作對相應檔案的讀和寫來執行。這種方式允許linux核心引出乙個簡單、低階的應用介面,稱為unix i/o,這使得所有的輸入和輸出都能以一種統一且一致的方式來執行:
程序是通過呼叫open函式來開啟乙個已存在的檔案或者建立乙個新檔案的:
#include
#include
#include
intopen
(char
*filename,int flags,mode_t mode)
;//返回:若成功則為新檔案描述符,若出錯為-1.
open函式將filename轉換為乙個檔案描述符,並且返回描述符數字。返回的描述符總是在程序中當前沒有開啟的最小描述符。flags引數指明了程序打算如何訪問這個檔案:
例如,下面的**說明如何以讀的方式開啟乙個已存在的檔案:
fd = open("foo.txt",o_rdonly, 0) ;
flags引數也可以是乙個或者更多位掩碼的或,為寫提供給一些額外的指示:
最後,程序通過呼叫close函式關閉乙個開啟的檔案。
#include
intclose
(int fd)
;//返回:若成功則為0,若出錯則為—1。
關閉乙個已關閉的描述符會出錯。
我們現在可以試試看這個了:
#include
intmain()
也許你會認為開啟fd1,關閉fd1,再開啟fd2,這樣會顯示fd2 = 0
或者fd2 = 1
。實際上不是這樣的,還記得剛才我們提到的嗎?
linux shell建立的每個程序開始時都有三個開啟的檔案:標準輸入(描述符為0)、標準輸出(描述符為1)和標準錯誤(描述符為2)。標頭檔案所以實際上,標準輸入、輸出和錯誤已經將0、1、2號檔案位置佔據了,之後的開啟檔案的操作都是從3開始的,因此我們得到的程式執行結果其實是定義了常量
stdin_fileno
、stdout_fileno
和stderr_fileno
,它們可用來代替顯式的描述符值。請一定要記住這一條,在這之後會非常重要
fd2 = 3
。
核心用三個相關的資料結構來表示開啟的檔案,我們簡單地概括為:
我們通過一張圖來形象地了解典型情況
不難想象,多個描述符也可以通過不同的檔案表表項來引用同乙個檔案。例如,如果以同乙個 filename呼叫open函式兩次,就會發生這種情況。關鍵思想是每個描述符都有它自己的檔案位置,所以對不同描述符的讀操作可以從檔案的不同位置獲取資料。具體就會如下圖所示:
很好理解,在這個例子中,fd1與fd2之間並沒有什麼關係,他們分別開啟了foobar.txt
(其中由6個ascii碼字元「foobar」組成)因此,程式輸出結果為
c = f接下來談論的題目牽扯到了 fork 和 wait,如果不記得的話,可以檢視我之前那篇學習筆記,系統級i/o學習筆記——檔案的開啟、關閉以及共享,其中有說明。
#include
intmain()
wait
(null);
read
(fd,&c,1);
printf
("c = %c\n",c)
;exit(0);}
父子程序中,實際上檔案是共享的。子程序有乙個父程序描述符表的副本。父子程序共享相同的開啟檔案表集合,因此共享相同的檔案位置。如下圖所示:
所以我們不難分析,在我們給出的例子中,父子程序共享乙個開啟資料夾,fork後,子程序讀取一位,而父程序則wait等待至子程序結束,之後再讀取一位,實際上總共讀取了2位,程式輸出:
c = o
系統級I O中的共享檔案
接下來展示一些示例 首先一些有用的標頭檔案放出來 include include include include include include include include include include include include include include include inclu...
APUE學習筆記 檔案IO
1 lseek的返回值應該判斷是否為0,而不是小於0。2 偏移量可以大於檔案大小。這個時候會有檔案空洞。4 open加上標誌 o create和o excl可以判斷檔案是否存在。5 dup和dup2可複製檔案描述符。並可指定複製後的描述符。6 linux ext2檔案系統不支援o sync標誌。可以...
java 檔案io學習筆記
1 使用file reader測試隨機io時間。實驗非預期結果 a 當我修改了small.txt檔案內容時,下乙個迴圈依然是舊的內容,new,read操作讀的是快取?b 當只執行一次read操作時,執行時間不足1ms,比想象中的快。據說磁碟尋道時間平均是8ms?基本上可以判斷為是作業系統核心預讀 核...