关闭进程中的所有打开文件

Mag*_*nus 17 unix process filehandle

如何查找进程中的所有打开文件(来自内部)?

fork()(之前exec())之后知道这似乎很有用.

我知道它的存在性getdtablesize()和可移植性sysconf(_SC_OPEN_MAX),但是尝试关闭每个有效的文件描述符似乎效率低下,无论是否有一个打开的文件.(我也意识到过早优化的危险,这更多是关于美学我猜:-)

R..*_*R.. 8

如果你的程序将调用forkexec,你真的应该打开所有的文件描述符与O_CLOEXEC标志,所以你不必之前,需要手动关闭它们exec.您还可以fcntl在打开文件后使用此标志添加此标志,但这受多线程程序中的竞争条件的影响.


Mar*_*wis 5

尝试关闭所有文件描述符可能听起来效率低,但实际上并没有那么糟糕.如果系统是好的,系统调用实现来查找文件描述符应该是相当有效的.

如果要查找仅关闭打开的文件描述符,可以在存在的系统上使用proc文件系统.例如,在Linux上,/ proc/self/fd将列出所有打开的文件描述符.迭代该目录,并关闭所有> 2,排除表示您正在迭代的目录的文件描述符.


小智 5

在支持它的系统上(这基本上意味着除 Linux 之外的任何 unix)有 closefrom(2) 系统调用,专门为此目的而设计。