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