以後如何回收和重用文件描述符?
在 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)的參數當然,與標準C99或C++11相比,文件描述符更像是POSIX或 Linux 的東西。例如,fileno(3) & open是在 POSIX 中定義的,而不是在 C99 中。
因此,如果你看到一個給定的數字——例如 49——被多次返回,
open
那是因為你的程序的其他部分(可能在某個庫中,在另一個執行緒中)呼叫close
了 49。核心永遠不會“神奇地”關閉文件描述符(程序終止時除外)未經詢問。您可以使用strace
或使用gdb
帶有斷點(可能是條件斷點)的調試器close