1. 程式人生 > >檔案描述符 檔案描述標誌 檔案狀態標誌

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

檔案描述符 File Descriptors

檔案描述標誌 File Descriptors Flag

檔案狀態標誌 File Status Flag

檔案描述符是一個標示,非負整數,類似於windows裡的控制代碼,為了與標準C保持一致(標準C裡的檔案的讀寫都是通過File Pointer)UNIX採用了這樣的三級結構,我混淆於檔案描述標誌和檔案狀態標誌,還是看英文來的有效,fd flag = close_on_exec。是在一個檔案在某程序中的標示,而由於檔案可以被多個程序開啟,因此這個file status flag能被很多個程序訪問到,它表示的是這個檔案在此刻的讀寫等標示。下面附上一份原文。

Note the difference in scope between the file descriptor flags and the file status flags. The former apply only to a single descriptor in a single process, whereas the latter apply to all descriptors in any process that point to the given file table entry. When we describe the fcntl function in Section 3.14

, we'll see how to fetch and modify both the file descriptor flags and the file status flags.

檔案描述符:標識檔案用的;
    檔案描述符標誌(當前只定義了一個檔案描述符標誌:FD_CLOEXEC):僅僅是一個標誌,當程序fork一個子程序的時候,在子程序中呼叫了exec函式時就用到了該標誌。意義是執行exec前是否要關閉這個檔案描述符;
    檔案狀態標誌:是在系統檔案表中,關於write、read等標誌

close_on_exec 是一個程序所有檔案描述符(檔案控制代碼)的點陣圖標誌,每個位元位代表一個開啟的檔案描述符,用於確定在呼叫系統呼叫execve()時需要關閉的檔案控制代碼(參見include/fcntl.h)。當一個程式使用fork()函式建立了一個子程序時,通常會在該子程序中呼叫execve()函式載入執行另一個新程式。此時子程序將完全被新程式替換掉,並在子程序中開始執行新程式。若一個檔案描述符在close_on_exec中的對應位元位被設定,那麼在執行execve()時該描述符將被關閉,否則該描述符將始終處於開啟狀態。

    當開啟一個檔案時,預設情況下檔案控制代碼在子程序中也處於開啟狀態。因此sys_open()中要復位對應位元位。

    設定close on exec標誌可通過fcntl(fd, F_SETFD, flags | FD_CLOEXEC)來進行設定,當然flags可先通過F_GETFD獲得。

    close on exec標誌可有如下三個用途:

    1、如果呼叫了exec(),應該關閉指定的套接字;

    2、如果設定了此選項,則連線監聽器設定所涉及的監聽器套接字以close-on-exec標誌;

    3、一般我們會呼叫exec執行另一個程式,此時會用全新的程式替換子程序的正文,資料,堆和棧等。此時儲存檔案描述符的變數當然也不存在了,我們就無法關閉無用的檔案描述符了。所以通常我們會fork子程序後在子程序中直接執行close關掉無用的檔案描述符,然後再執行exec。

http://blog.chinaunix.net/uid-24701781-id-3321380.html

http://blog.csdn.net/ddppqq/article/details/13095723