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

2021-08-16 12:12:45 字數 2416 閱讀 5383

二、檔案狀態標誌

三、開啟檔案的核心資料結構圖

四、介面函式

一、檔案描述符標誌

每個程序為所有開啟的檔案維護對應的fd flag。當前只定義了乙個檔案描述符標誌:fd_cloexec:若設定某個檔案的fd flag(即為1),則程序fork出子程序時,執行exec前要關閉這個檔案描述符。

fd_closeexec帶來的安全問題

父程序開啟了某些檔案並fork子程序,子程序就會預設有這些檔案的讀取許可權,但很多時候並不想讓子程序有這麼多的許可權。——解決辦法:設定fd_closeexec標誌,exec新程式之前關閉繼承的開啟檔案。

二、檔案狀態標誌

指明檔案的狀態屬性,它們由open的flags引數指明。與「檔案描述符標誌對應程序」不同,檔案狀態標誌由與同一次開啟檔案相連的所有重複檔案標誌符所共享(涉及dup時,只要共享檔案表項即共享fd status flag)。

檔案狀態標誌分類

1、訪問方式標誌:指明允許檔案標誌符用於讀、寫或兩者兼之,包括o_rdonly、o_wronly和o_rdwr。

2、開啟時標誌:指明開啟檔案時影響open行為的一些選項。

3、i/o操作方式標誌:使用fd讀/寫的工作方式。這些標誌由open()設定,之後可以用fcntl()獲取和改變。

o_nonblock:用於非阻塞i/o。

o_async:用於訊號驅動的i/o(非同步i/o)。若此位設定,當檔案標誌符中有輸入資料時會生成sigio訊號。

o_sync:用於同步i/o。若此位設定,檔案按同步i/o方式開啟,並將導致任何寫該檔案的操作都阻塞呼叫程序直至核心i/o緩衝區的資料以及與此次寫有關的檔案屬性已全部寫至物理儲存介質。

o_dsync:用於同步資料i/o。若此位設定,檔案按同步i/o方式開啟,並將導致任何寫該檔案的操作都阻塞呼叫程序直至核心i/o緩衝區的資料已全部寫至物理儲存介質。但如果所寫的資料不影響讀剛寫入的資料,則不等待檔案屬性更新。

o_rsync:若此位設定,檔案按同步i/o方式開啟,並將導致任何讀該檔案的操作都將等待所有寫入同一區域的寫操作按o_dsync和o_sync完成後再進行。如果同時設定了o_sync 和 o_rsync標誌,則讀操作將阻塞直到檔案的訪問時間屬性已寫至物理儲存介質。如果同時設定了o_dsync 和 o_rsync標誌,則讀操作將阻塞直到所有與保持檔案完整性有關的資料都已寫至物理儲存介質。

簡單地說,o_sync、o_dsync和o_rsync這幾個標誌的主要作用是使資料直接寫到磁碟或直接從磁碟讀入。

三、開啟檔案的核心資料結構圖

由以上三幅圖知:

四、介面函式

open

int open(const

char* path, int oflags, /* mode_t mode */); //成功,返回fd;出錯,返回-1

dup/dup2:複製乙個現有的檔案描述符
#include 

int dup(int fd);

int dup2(int fd, int fd2); //成功,都返回new_fd;出錯,都返回-1

dup:返回可用檔案描述符的最小值。預設清除fd_cloexec。

dup2:複製為指定檔案描述符:若fd2已經開啟,則先關閉該檔案再複製並返回fd2,同時清除fd_cloexec;若fd=fd2,不關閉該檔案並保持它的檔案描述符標誌狀態,同時返回fd2。

fcntl:改變已開啟檔案的屬性(只需提供fd即可)

函式原型

#include 

int fcntl(int fd, int cmd, /* int arg */); //成功,依賴於cmd;出錯,都返回-1

函式的功能:5類

複製乙個已有的描述符(cmd=f_fupfd 或 f_dupfd_cloexec)

獲取/設定檔案描述符標誌(cmd=f_getfd 或 f_setfd)

獲取/設定檔案狀態標誌(cmd=f_getfl 或 f_setfl)

獲取/設定非同步i/o所有權(cmd=f_getown 或 f_setown)

獲取/設定記錄鎖(cmd=f_getlk、f_setlk 或 f_setlkw)

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

檔案描述符標誌,是體現程序的檔案描述符的狀態,fork程序時,檔案描述符被複製 目前只有一種檔案描述符 fd cloexec 檔案狀態標誌,是體現程序開啟檔案的一些標誌,fork時不會複製file 結構,而是兩個程序檔案描述符指向同乙個file 當fd的exec標誌為0時 1.檔案描述符標誌 str...

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

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

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...