首先我們知道作業系統是乙個「純正」的搞管理的軟體,它對硬體的管理方式是先描述起來,再組織起來;同樣,當我們開啟
檔案時,作業系統在記憶體中要建立相應的資料結構來描述目標檔案,這個資料結構就是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作業系統下 一切皆檔案 所以在這個條件下,所有研究的物件都變相的相當於研究檔案,那麼對檔案系統的研究也應該是必須的。我們的核心利用檔案描述符來訪問檔案,每個檔案描述符都是非負整數,開啟現存的檔案或者是新建檔案時,核心會返回乙個檔案描述符,讀寫檔案也需要使用檔案描述符來指定待...