檔案I O之 開啟檔案在核心中的表示

2021-06-23 07:05:00 字數 1321 閱讀 7581

在unix系統中,一切皆檔案。系統把目錄、字元裝置、塊裝置、套接字都當做檔案來對待。對於檔案的操作,使用i/o函式,這裡所說的i/o函式是指系統呼叫。大多數檔案的i/o要用到這5個函式:open、read、write、lseek、close。這5個函式均是不帶緩衝的i/o。

開啟檔案在核心中的表示

對於開啟的檔案,都是通過檔案描述符來描述。乙個沒開啟的檔案呼叫open開啟後,就會返回乙個檔案描述符。檔案描述符是乙個非負整數,標準輸入、標準輸出、標準出錯對應的檔案描述符分別為0、1、2,它們常常用符號常量stdin_fileno、stdout_fileno、stderr_fileno描述。

在核心中,使用三種資料結構來描述乙個開啟的檔案。

1、每個程序在程序表中都有乙個記錄項,記錄項中有乙個開啟的檔案描述符表,可以將其視為乙個向量,每個描述符佔一項。記錄著檔案描述符標誌和指向乙個檔案表項的指標。

2、核心為所有開啟的檔案維持一張檔案表,表中包含檔案狀態(讀、寫、添寫、同步和非阻塞等)、當前檔案偏移量、指向該檔案v節點表項的指標。

3、每個開啟的檔案都有乙個v節點(v-node)結構。v節點包含了檔案的型別和對此檔案各種操作的函式指標。

每個程序都有自己的檔案表項,這是如果兩個程序開啟同乙個檔案的話(乙個在檔案描述符3上面開啟,另乙個在檔案描述符4上面開啟),會有如下現象:

當兩個程序同時對這個檔案操作時,假設先定位lseek,在寫入write,由於這是兩個操作,所以可能會產生意想不到的結果。比如執行順序如下:

程序1:lseek

程序2:lseek

程序3:write      此時程序1的lseek可能就失效了,但程序1不知道

程序1:write     寫入的位置可能和預想的不一樣了

這時就需要程序間的同步了。

下面看兩道重定向的題目:

./a.out  >outfile  2>&1

上面表示標準輸出與標準出錯一起重定向到outfile。因為./a.out把標準輸出重定向到outfile,之後2>&1標準出錯重定向到標準輸出(這時標準輸出已經重定向到outfile)

./a.out  2>&1  >outfile

上面表示標準輸出重定向到outfile,而標準出錯仍在終端。因為2>&1表示把標準出錯重定向到終端,1>outfile表示把標準輸入重定向到outfile。標準出錯在標準輸出重定向之前已經重定向了。

在linux核心中讀寫檔案

1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...

在linux核心中讀寫檔案

1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...

在linux核心中讀寫檔案

1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...