1. 程式人生 > >[Linux] 檔案描述符和開啟檔案之間的關係

[Linux] 檔案描述符和開啟檔案之間的關係

前言

檔案描述符、檔案控制代碼和i-node之間的關係,應該是Linux Native Programming的基本功。Golang、C++11寫久了之後,這些概念有些淡忘,今天順便梳理下。

鋪墊

為了搞清楚這當中的關係,我們首先要了解核心維護的3個數據結構:

  • 程序級的檔案描述符表
  • 系統級的開啟檔案控制代碼
  • 檔案系統級的i-node表

程序級的檔案描述符表

單條表項,包括:

  • 檔案描述符標誌,如close_on_exec標誌;
  • 對應檔案控制代碼的索引

系統級的開啟檔案控制代碼

單條表項,包括:

  • 當前檔案偏移
  • 檔案開啟標誌、訪問許可權
  • 對應inode物件的索引

檔案系統級的i-node表

單條表項,包括:

  • 檔案型別和訪問許可權
  • 檔案的基本屬性

分析

在前面,我們對基本概念進行了鋪墊;接下來,我們結合下圖進行更加細緻的分析。

  • 在程序A中,檔案描述符1和檔案描述符20指向同一個檔案控制代碼23,這可能是dup()系統呼叫的結果;
  • 程序A的檔案描述符2和程序B的檔案描述符2指向同一個檔案控制代碼70,這可能是fork()後的結果(程序A、B互為父子程序);
  • 程序A的檔案描述符0和程序B的檔案描述符3雖然指向不同的開啟檔案控制代碼,但是各自的開啟檔案控制代碼均指向inode表中的同一項, 這可能是程序獨自對同一檔案發起了open()呼叫;

在這裡插入圖片描述

表象

  • 兩個不同的檔案描述符,若指向同一開啟檔案控制代碼,將共享同一檔案偏移量;如果其中一個檔案描述符操作了檔案偏移,則另一個檔案描述符也將受影響;
  • 兩個不同的檔案描述符,若指向同一開啟檔案控制代碼,將共享檔案標誌;如果其中一方通過fcntl修改了檔案flag,則另一方也將受到影響;
  • 檔案描述符標誌(close_on_exec)為程序中的檔案描述符所私有。

參考文獻

TLPI