檔案I/O

太二發表於2013-06-22

即《UNIX環境高階程式設計》第三章,搬磚。

檔案I/O,也即非緩衝I/O,並非ISOC的一部分,但是是POSIX.1的組成部分,當然也就包含在Single UNIX Specification中。

閉上眼睛想想檔案I/O都需要那些東西:首先是要有對檔案的描述,然後是基本的操作——開啟、關閉、讀、寫,差不多了?哦,還有定位。

是的,也就是這些。相對應的,它們是:檔案描述符、open函式、close函式、read函式、write函式和lseek函式。

1、檔案描述符是什麼?是一個非負整數,代表對檔案的引用。一般慣例來說,最小的檔案描述符都是有主的。0代表標準輸入,1代表標準輸出,2代表標準出錯。但是這不是UNIX核心的規定。所以,為了避免某個天才程式設計師設計一種匪夷所思的系統,使用了別的數值,我們還是不要用這些魔數了吧。事實上,在標頭檔案中(顯然這也是POSIX.1的一部分),定義了STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。在比較現代的UNIX系統實現中,可以認為檔案描述符的範圍沒有限制。

2、如何與檔案描述符互動?檔案描述符是open函式的返回值,其他所有函式都需要檔案描述符作為引數。

3、怎麼使用open函式呢?首先需要提一句的是,其實還有一個creat函式,用於建立新檔案。其實還是creat看起來和諧一點兒,不過它有固有缺陷——只能以只寫方式開啟所建立的檔案,哦,所以很自然地,就被逐漸強大起來地open取代了。由此可見,打鐵還需自身硬啊。夠了,還是說說怎麼使用open函式吧!如果是對於已存在的檔案,需要設定兩個引數:一是檔案路徑,二是訪問標誌位。檔案路徑自不必細說,訪問標誌位的使用類似裝飾模式( !@#$%^&*),首先需要在O_RDONLY、O_WRONLY、O_RDWR中選擇一個,然後在其他選項中選擇任意個(O_APPEND、O_CREAT、O_EXCL、O_TRUNC、O_NOCTTY和O_NONBLOCK),“裝飾”的方式是使用或運算。具體嘛意義以後再說……(坑)

4、open過程中會有什麼問題呢?檔案不存在不算什麼,意料之中的事兒。但是,檔案路徑和檔名都有長度限制(如PATH_NAME、NAME_MAX),一旦超出限制,系統有兩種處理方式:出錯(errno=ENAMETOOLONG)或者無聲無息地截短,這在POSIX.1中是由_POSIX_NO_TRUNC決定的。

5、好,我學會開車了,怎麼剎車呢?用close函式以檔案描述符為引數即可,其實當程式中止時,核心會自動關閉它所開啟的檔案。

相關文章