Linux

以後如何回收和重用文件描述符?

  • June 22, 2015

在 C 和 C++ 的上下文中,close()系統呼叫是核心回收 fd 並稍後open()在同一程序生命週期中呼叫時重用它的唯一方法嗎?多執行緒程序呢?

仔細閱讀close(2)Advanced Linux Programming

您的表述是錯誤的: close 是一個系統呼叫(在 Linux 的syscalls(2)中列出),應用程序通過它告訴核心釋放資源(而不是相反)。您可以使用strace(1)來了解某些命令或程序執行的系統呼叫。另請參見pthreads(7)credentials(7)fork(2)execve(2)clone(2)

是的,文件描述符(以及虛擬記憶體中的地址空間,參見mmap(2) )對於給定程序的所有執行緒都是通用的。但是,您可能(很少)直接使用低級clone(2)系統呼叫創建“執行緒”(實際上僅由pthreads之類的執行緒庫的實現者使用),並且在不太可能的情況下,您沒有使用 不同的東西. 但直接召喚是一門黑魔法。CLONE_FILES``clone

對於 pid 1234 的給定程序,在 Linux 上,您可以通過查詢文件描述符集(在proc(5)中)/proc/1234/fd/ 和通過記憶體映射/proc/1234/maps(等等……有許多有用的文件和連結/proc/1234)。從程序內部,您可以使用/proc/self/fd/- 例如作為opendir(3)的參數

當然,與標準C99C++11相比,文件描述符更像是POSIX或 Linux 的東西。例如,fileno(3) & open是在 POSIX 中定義的,而不是在 C99 中。

因此,如果你看到一個給定的數字——例如 49——被多次返回,open那是因為你的程序的其他部分(可能在某個庫中,在另一個執行緒中)呼叫close 了 49。核心永遠不會“神奇地”關閉文件描述符(程序終止時除外)未經詢問。您可以使用strace或使用gdb 帶有斷點(可能是條件斷點)的調試器close

引用自:https://unix.stackexchange.com/questions/211256