文件描述符表、文件表、索引節點表
文件描述符:用於內核訪問文件,打開或者新建文件時,會返回一個文件描述符,內核使用文件描述符訪問文件
分配原則:最小分配
取值範圍:非負整數,0~MAX-1 其中默認是0、1、2用於系統標準輸入、標準輸出、標準錯誤
系統調用open
系統調用open是進程要存取一個文件中的數據所必須採取的第一步,因爲只有通過系統調用open才能返回對應的文件描述符。文件描述符標誌特定進程正在訪問的文件。每運行一個進程,內核會默認爲其打開三個進程描述符,0:標準輸入,1:標準輸出,2:標準錯誤。
fd=open(pathname,flags,modes);
例如
int fd = open("/Users/hupac/Public/k.c", 0666, O_RDWR);
其中pathname爲路徑名,0666爲訪問權限,O_RDWR給出文件的訪問許可權,這裏是僅讀寫。由代碼可見,open系統調用返回的整數稱爲文件描述符。其他與文件操作相關的系統調用如讀read,寫write,定位lseek都要使用系統調用open返回的文件描述符。
open系統調用過程:
- 內核用算法namei在文件系統中查找文件名參數。若文件不存在或不允許存取,則返回錯誤。
- 內核找到內存中的索引節點後,它檢查打開文件的許可權,然後爲該文件在文件表中分配一個表項,設置引用數+1和文件內部偏移量。
文件表中存放着文件中的字節偏移量和指向文件索引節點的指針。 - 內核分配用戶文件描述符表項,將指針指向文件表項。
- 最後返回文件描述符。
每個open調用都導致用戶描述符表和內核文件表中分配一個唯一表項,但在內核的內存索引節點表中,對每個文件只有一個表項。