對於核心而言,所有開啟的檔案都是通過檔案描述符引用的。那麼檔案描述符又是什麼呢?
通過上圖,我們可以清楚的認識到檔案描述符就是從0開始的小的非負整數,核心用以標識乙個特定程序正在訪問的檔案。當開啟乙個檔案或建立乙個檔案,核心向程序返回乙個檔案描述符。
linux程序預設情況下會有三個預設開啟的檔案描述符
0(標準輸入)
1(標準輸出)
2(標準錯誤)
0,1,2對應的物理裝置一般為:鍵盤,顯示器,顯示器
c庫中標準輸入往stdin檔案輸入,標準輸出往stdout檔案輸出,標準錯誤輸出到stderr檔案
我們輸入乙個1,讀出乙個1,將會寫出兩個1在buf中,如下圖所示:
step1:描述檔案
當我們開啟乙個檔案時,作業系統在記憶體中要建立相應的資料結構來描述這個檔案,定義乙個file結構體,表示乙個已經開啟的檔案物件。
step2:組織檔案
程序執行open系統呼叫,程序和檔案必須關聯起來。每個程序都有乙個指標file*型別,指向一張表files_struct,該表中含有乙個指標陣列每個元素的下標指向乙個開啟檔案的指標。
輸出結果: fd:3
原因是以唯讀的方式開啟,新開啟的檔案的檔案描述符為3
如果我們事先close(0),則輸出的結果為:fd:0,因為檔案描述符的分配規則中:當前沒有被使用的最小乙個下標,作為新的檔案描述符
close(2),則輸出的結果為:fd:2
那麼如果是close(1)呢?將不會輸出結果,因為把標準輸出關閉了
重定向
* 輸出重定向(>)
* 追加重定向(>>)
* 輸入重定向(
我們以輸出重定向為例,理解一下重定向的本質
從圖中我們可以看出,本來往1號描述符寫的內容都寫在了新的檔案中,不再標準輸出。
printf是c庫當中的io函式,一般由stdout檔案輸出,stdout檔案底層訪問檔案的時候,找的是檔案描述符fd:1,但此時fd:1下標表示的內容,已經更改為新開啟檔案的位址,不再是顯示器的位址,輸出的資訊都會寫入新的檔案中,就完成了輸出重定向。
檔案描述符與重定向
1 標準輸出和標準錯誤重定向 2 利用 操作符將檔案讀入stdin 3 自定義檔案描述符 4 tee命令 1 例如echo命令就是將指定的字串送到標準輸出,那麼我們就可以結合echo命令將指定字串傳送到指定的檔案 在這裡就是將檔案描述符stdout 1 的內容通過重定向操作符重定向到了test.tx...
Linux 檔案描述符,檔案重定向
檔案重定向 先來說說檔案 當我們開啟乙個檔案時,作業系統為了管理該檔案,會建立乙個資料結構來描述它,記錄他的各種資訊,這個資料結構就是file結構體,乙個file結構體就表示了乙個已經開啟的檔案。程序中使用open函式開啟某個檔案,前提是需要我們將程序與檔案聯絡起來。所以程序pcb中就有乙個 fil...
關於dup改變檔案描述符(輸出重定向)
函式dup,接收乙個舊的檔案描述符,返回乙個新的檔案描述符 最小的未被分配的檔案描述符 什麼是檔案描述符?當程式開啟乙個現有檔案或者建立乙個新檔案時,核心向程序返回乙個檔案描述符。核心 kernel 利用檔案描述符 file descriptor 來訪問檔案。檔案描述符是非負整數。案例 將本來輸出到...