Linux 檔案描述符

2021-08-17 19:03:55 字數 2020 閱讀 2690

我們之前就知道在linux作業系統下 「一切皆檔案」 ,所以在這個條件下,所有研究的物件都變相的相當於研究檔案,那麼對檔案系統的研究也應該是必須的。

我們的核心利用檔案描述符來訪問檔案,每個檔案描述符都是非負整數,開啟現存的檔案或者是新建檔案時,核心會返回乙個檔案描述符,讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。

這樣說來,其實每個開啟的檔案,都對應屬於其本身的乙個檔案描述符。

由圖可以理解到,在我們程序的程序控制塊即pcb中有乙個結構體指標file,它指向了乙個files_struct結構體,這個結構體內儲存著乙個指標陣列,其每個元素都是乙個指標,這個指標就是開啟檔案的指標,而我們所謂的檔案描述符就是這些指標的下標,所以只要拿著檔案描述符就可以找到對應的檔案。

這個也驗證了在linux下,系統預設開啟三個檔案,即標準輸入、標準輸出、標準錯誤。而我們開啟乙個新的檔案,檔案描述符是從3開始的。

先看乙個**

我們發現,當我們利用close關閉掉檔案描述符1所對應的檔案時,然後進行printf,竟然在執行test的時候螢幕沒有輸出。這是為什麼呢?

我們之前說過,系統預設開啟三個檔案,即標準輸入、標準輸出、標準錯誤,也就是在我們關閉1之後,標準輸出被關閉了,標準輸出一般對應的是顯示器,所以在我們printf的時候,在file_struct結構體中,file*回去尋找此時檔案描述符為1的內容進行列印,它並不知道此時的1已經不是對應的顯示器了,而這個時候的1則對應我們開啟的新檔案,即myfile,所以他將內容寫入了這個檔案。

常見的重定向有:> < >>其中》為追加重定向。

我們發現在直接執行./test的時候,顯示器列印三行hello,而我們隊程序實現重定向的時候,發現printf與fwrite列印了兩次,而write只有一次。這是為什麼?

c庫函式寫入檔案的時候是進行的全緩衝,而寫在顯示器上是行緩衝,所以我們在定義時定義成全部都是\n結尾,也就是說在螢幕上輸出的時候,直接輸出整句話,不再等待。所以顯示了三句話。而當我們由螢幕改為檔案後,原來的行緩衝輸出被變成了全緩衝,此時\n只是單純的換行,並不會直接輸出,那麼這個時候由於fork()函式的存在子程序也擁有乙份父程序相同的資料,那麼最終重定向到檔案的時候,則將緩衝區內的所有內容全部定向到新的檔案當中,所以也就出現了五句話,那麼為什麼write這句話並沒有在檔案當中呢?原因是因為printf,fwrite都為庫函式,而庫函式自帶緩衝區,而write為系統呼叫,它沒有緩衝區,也就是說他直接輸出。

庫函式其實是在系統呼叫的基礎上對系統呼叫進行封裝,但是write並未有緩衝區,而fwrite有緩衝區是為什麼呢?這其實是因為這個緩衝區是二次加上的,有c標準庫提供。

linux檔案描述符

本文介紹了檔案描述符,1 首先說什麼是檔案描述符,它有什麼作用?檔案描述符是乙個簡單的整數,用以標明每乙個被程序所開啟的檔案和socket。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案,並指定訪問該檔案的方式,呼叫成功後返回乙個檔案描述符。creat 開啟乙個檔案,如果該檔案不存在,則建立它...

linux檔案描述符

當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是乙個低階的正整數。最前面的三個檔案描述符 0,1,2 分別與標準輸入 stdin 標準輸出 stdout 和標準錯誤 stderr 對應。因此,函式 scanf 使用 stdin,而函式 pri...

Linux檔案描述符

在linux通用i o模型中,i o操作系列函式 系統呼叫 都是圍繞乙個叫做檔案描述符的整數展開。這不禁讓人產生疑問 這個整數代表什麼?乙個數值代表乙個檔案嗎?隨便傳乙個整數進去呼叫可以嗎?玩轉linux舊群已滿,新群 278378501 解答以上疑問,需要更深入學習 檔案描述符 file desc...