close on exec标志位
首先說明下文件描述符,文件描述符標志,文件狀態(tài)標志的區(qū)別:
? ? 文件描述符:標識文件用的;
? ? 文件描述符標志(目前就只有一個close-on-exec):僅僅是一個標志,當進程fork一個子進程的時候,在子進程中調(diào)用了exec函數(shù)時就用到了該標志。意義是執(zhí)行exec前是否要關閉這個文件描述符;
? ? 文件狀態(tài)標志:是在系統(tǒng)文件表中,關于write、read等標志。
? ? close_on_exec 是一個進程所有文件描述符(文件句柄)的位圖標志,每個比特位代表一個打開的文件描述符,用于確定在調(diào)用系統(tǒng)調(diào)用execve()時需要關閉的文件句柄(參見include/fcntl.h)。當一個程序使用fork()函數(shù)創(chuàng)建了一個子進程時,通常會在該子進程中調(diào)用execve()函數(shù)加載執(zhí)行另一個新程序。此時子進程將完全被新程序替換掉,并在子進程中開始執(zhí)行新程序。若一個文件描述符在close_on_exec中的對應比特位被設置,那么在執(zhí)行execve()時該描述符將被關閉,否則該描述符將始終處于打開狀態(tài)。
? ? 當打開一個文件時,默認情況下文件句柄在子進程中也處于打開狀態(tài)。因此sys_open()中要復位對應比特位。
? ? 設置close on exec標志可通過fcntl(fd, F_SETFD, flags | FD_CLOEXEC)來進行設置,當然flags可先通過F_GETFD獲得。
? ? close on exec標志可有如下三個用途:
? ? 1、如果調(diào)用了exec(),應該關閉指定的套接字;
? ? 2、如果設置了此選項,則連接監(jiān)聽器設置所涉及的監(jiān)聽器套接字以close-on-exec標志;
? ? 3、一般我們會調(diào)用exec執(zhí)行另一個程序,此時會用全新的程序替換子進程的正文,數(shù)據(jù),堆和棧等。此時保存文件描述符的變量當然也不存在了,我們就無法關閉無用的文件描述符了。所以通常我們會fork子進程后在子進程中直接執(zhí)行close關掉無用的文件描述符,然后再執(zhí)行exec。
總結
以上是生活随笔為你收集整理的close on exec标志位的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何调用带参方法
- 下一篇: 1-10:学习shell之进程