系統級I O學習筆記 檔案的開啟 關閉以及共享

2021-10-13 03:08:26 字數 2490 閱讀 9031

在了解檔案之前,我們顯然需要對本文討論的檔案所屬的範疇,即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)。標頭檔案定義了常量stdin_filenostdout_filenostderr_fileno,它們可用來代替顯式的描述符值。請一定要記住這一條,在這之後會非常重要

所以實際上,標準輸入、輸出和錯誤已經將0、1、2號檔案位置佔據了,之後的開啟檔案的操作都是從3開始的,因此我們得到的程式執行結果其實是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?基本上可以判斷為是作業系統核心預讀 核...