很多人認為文件是一些存儲在磁盤上的數據,但是Linux采用了一種更為抽象的方法。將設備抽象成文件。設備文件和普通文件一樣具有文件名、另一個i節點號、一個文件所有者、一個權限位集合和最近修改時間。平時了解的和文件有關的所有內容都將被運用於終端和其他的設備。
普通文件,即常用的磁盤文件由字節組成,磁盤文件中的字節數就是文件大小。而設備文件是鏈接,不是容器。鍵盤和鼠標不存儲點擊數:)設備文件的i節點存儲的是指向內核的子程序的指針,而不是文件的大小和存儲列表。內核中傳輸設備數據的子程序被稱為設備驅動程序。
文件類型的區別體現在i節點上:
磁盤文件的i節點包含指向數據塊的指針列表
設備文件的i節點包含一個指向內核中設備驅動程序的指針
磁盤連接和設備連接
與磁盤文件的連接通常包含內核緩沖區,即磁盤連接具有緩沖區這樣一個屬性。到終端的連接則不同,進程需要盡快的將數據傳送出去。
也就是說,二者的連接屬性不同,針對於某一個特定的文件與設備的連接,可以思考:1.連接有哪些屬性?2.如何檢測當前屬性?3.如何改變當前屬性?
關於2和3的答案,是使用系統調用fcntl,文件描述符的屬性被編碼在一個整數的位中。fcntl通過讀寫該整數位來控制文件描述符。
如:
#include<fcntl.h>
int s;
s = fcntl(fd, F_GETFL);
s |= OSYNC;
result = fcntl(fd, F_SETFL, s);
從內核中讀取設置到變量,修改變量值,將設置返回內核,是Linux中讀取和修改連接屬性的典型方法。
fcntl並不是僅有的用來設置文件描述符屬性的方法。通常在打開一個文件時,應該知道需要怎樣的設置。可以通過系統調用open的第二個參數的一部分來設置文件描述符的屬性。
如: fd = open(FILE, OWRONLY | O_APPEND | O_SYNC );