檔案描述符標誌和檔案狀態標誌區別

2021-09-02 11:35:31 字數 1179 閱讀 9493

檔案描述符標誌,是體現程序的檔案描述符的狀態,fork程序時,檔案描述符被複製;目前只有一種檔案描述符:fd_cloexec

檔案狀態標誌, 是體現程序開啟檔案的一些標誌,fork時不會複製file 結構,而是兩個程序檔案描述符指向同乙個file(當fd的exec標誌為0時)

1.檔案描述符標誌:

struct task_struct—>struct files_struct—> | struct file * fd_array[nr_open_default]

| struct fdtable fdtab

struct fdtable ;

fdtable欄位 fd_set *close_on_exec;儲存著程序檔案描述符標誌

當前只定義了乙個檔案描述符標誌fdcloexec

0: exec時不關閉已經開啟的檔案描述符

1: exec時關閉已經開啟的檔案描述符

2.檔案標誌:

struct file

open 函式原型:

extern int open (__const char *__file, int __oflag, …) __nonnull ((1));

fcntl()函式能設定讀和寫上述兩個標誌

3.exec函式集對檔案描述符標誌的影響:

1>對開啟檔案的處理與每個描述符的e x e c關閉標誌值有關。程序中每個開啟描述符都有乙個exec關閉標誌。

若此標誌設定,則在執行exec時關閉該描述符,否則該描述符仍開啟。除非特地用fcntl設定了該標誌,

否則系統的預設操作是在exec後仍保持這種描述符開啟。

2>posix.1明確要求在exec時關閉開啟目錄流(見4 . 2 1節中所述的opendir函式),這通常是由

opendir函式實現的,它呼叫fcntl函式為對應於開啟目錄流的描述符設定exec關閉標誌。

4.dup函式對檔案描述符標誌的影響:

新描述符的執行時關閉(close_on_exec)檔案描述符標誌總是由dup函式清除

5.fcntl() 函式既能改變檔案描述符標誌,也能改變檔案標誌:

int fcntl(int fields, int cmd,…/* int arg * / ) ;

• 獲得/設定檔案描述符標記(cmd =fgetfd或fsetfd)

• 獲得/設定檔案狀態標誌 (cmd =fgetfl或fsetfl)

檔案描述符標誌 檔案狀態標誌

二 檔案狀態標誌 三 開啟檔案的核心資料結構圖 四 介面函式 一 檔案描述符標誌 每個程序為所有開啟的檔案維護對應的fd flag。當前只定義了乙個檔案描述符標誌 fd cloexec 若設定某個檔案的fd flag 即為1 則程序fork出子程序時,執行exec前要關閉這個檔案描述符。fd clo...

檔案描述符標誌 檔案屬性標誌 開啟檔案標誌

檔案描述符標誌用於乙個程序中的 乙個檔案描述符,檔案屬性標誌應用於指向該給定檔案結構的任何程序中的所有檔案描述符。呼叫 fcntl 函式可以獲得和修改檔案描述符標誌和檔案屬性標誌。檔案描述符 檔案屬性標誌檔案開啟標誌即檔案屬性標誌。在檔案i o操作時會使用到檔案屬性標誌,例如open函式的引數中就要...

檔案流和 檔案描述符

include apue.h int glob 6 int main void else if pid 0 i printf pid d,glob d,var d n getpid glob,var sprintf buf,d n i write stdout fileno,buf,strlen b...