Linux 檔案描述符詳解

2021-08-17 17:32:13 字數 2773 閱讀 3399

首先我們知道作業系統是乙個「純正」的搞管理的軟體,它對硬體的管理方式是先描述起來,再組織起來;同樣,當我們開啟

檔案時,作業系統在記憶體中要建立相應的資料結構來描述目標檔案,這個資料結構就是file結構體,儲存了檔案相關的資訊,表示

乙個已經開啟的檔案物件。

在c語言中我們學習了幾種檔案相關操作函式,像fopen,fclose,fread,fwrite這些都是c標準庫當中的函式,而在linux下我們要解

析的 open,close,read,write,lseek都屬於系統呼叫介面。下面我們逐個分析一下:

呼叫open函式可以開啟或者建立乙個檔案。若成功,返回檔案描述符;若出錯,返回-1。

path引數是要開啟或建立檔案的名字。flags引數可用來說明此函式的多個選項。用乙個或多個常量進行「或」運算構成flags參

數。(這些常量在標頭檔案中定義,在unix環境高階程式設計第三版3.3節中也有每個常量的詳解)。接下來我們來看幾個比

較常用的常量:

o_rdonly        唯讀開啟。(大多數定義為0)

o_wronly       只寫開啟。(大多數定義為1)

o_rdwr            讀、寫開啟。(大多數定義為2)

o_exec              只執行開啟

o_creat            若此檔案不存在則建立它。使用此選項時,open函式需同時說明第三個引數mode,用mode指定該新檔案的

訪問許可權位。

o_excl               如果同時指定了o_creat,而檔案已經存在,則出錯。用此可以測試乙個檔案是否存在,如果不存在,則創

建此檔案,這使測試和建立兩者成為乙個原子操作。 

可呼叫close函式關閉乙個已經開啟檔案。fd代表要關閉檔案的檔案描述符。若成功,返回0;若出錯,返回-1。

呼叫read函式從開啟檔案中讀資料。

若讀取成功,則返回讀到的位元組數,如已到達檔案的尾端,則返回0。

第乙個引數是檔案描述符,*buf是乙個指向要讀取檔案的檔案指標。count是要讀取的位元組數。

呼叫write函式向開啟檔案寫資料。若成功,返回寫入的位元組數;若失敗,返回-1。

上面就是我們對檔案進行相關操作的部分函式,這些是最基本的,這些東西定要運用的相當熟練。

我們知道,程序執行open系統呼叫,必須讓程序和檔案關聯起來。每個程序的pcb中都有乙個指向一張表的指標,該錶最重要的

部分就是包含乙個指標陣列,陣列裡的每個元素都指向乙個開啟檔案,所以,檔案描述符就是這個指標陣列的下標。我們只要拿

到檔案描述符,就能找到對應的檔案。可以結合下圖對檔案描述符有個更加深入的了解:

接下來我們看看檔案描述符的分配規則:在files_struct陣列當中,找到當前沒有被使用的最小的乙個下標,作為新的檔案描述

符。下面我們驗證一下

看下面這段**:

#include#include#include#includeint main()

printf("fd: %d\n",fd);

close(fd);

return 0;

}

輸出結果:

我們關閉0再看:

#include#include#include#includeint main()

printf("fd: %d\n",fd);

close(fd);

return 0;

}

執行結果:

那如果關閉1呢?我們用**來看一下結果吧:

#include#include#include#includeint main()

printf("fd: %d\n",fd);

fflush(stdout);

close(fd);

return 0;

}

看一下執行結果:

我們發現本來應該輸出到顯示器上的內容出現在了檔案裡,fd = 1。這種現象叫做輸出重定向,是怎麼做到輸出重定向呢?

我們把本來的標準輸出與fd下標為1的連線斷掉之後根據檔案描述符的分配工作,現在fd下標為1所表示內容已經變成了myfile的

位址,不再是顯示器檔案的位址,所以輸出的任何訊息都會往檔案中寫入,進而完成輸出重定向。

以上內容就是對檔案描述符的詳解。

linux檔案描述符

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

linux檔案描述符

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

Linux 檔案描述符

我們之前就知道在linux作業系統下 一切皆檔案 所以在這個條件下,所有研究的物件都變相的相當於研究檔案,那麼對檔案系統的研究也應該是必須的。我們的核心利用檔案描述符來訪問檔案,每個檔案描述符都是非負整數,開啟現存的檔案或者是新建檔案時,核心會返回乙個檔案描述符,讀寫檔案也需要使用檔案描述符來指定待...