如何在进程中找到所有打开的文件(从内部本身)?
这一点似乎很有用 fork()
(之前 exec()
)。
我知道存在的 getdtablesize()
而且更便携 sysconf(_SC_OPEN_MAX)
,但尝试关闭每一个似乎效率低下 有效 文件描述符,是否有一个打开的文件。 (我也意识到过早优化的危险,这更多是关于我认为的美学:-)
如何在进程中找到所有打开的文件(从内部本身)?
这一点似乎很有用 fork()
(之前 exec()
)。
我知道存在的 getdtablesize()
而且更便携 sysconf(_SC_OPEN_MAX)
,但尝试关闭每一个似乎效率低下 有效 文件描述符,是否有一个打开的文件。 (我也意识到过早优化的危险,这更多是关于我认为的美学:-)
如果你的程序会打电话 fork
和 exec
,你真的应该打开所有的文件描述符 O_CLOEXEC
标志,所以你不必手动关闭它们 exec
。你也可以使用 fcntl
在打开文件后添加此标志,但这受多线程程序中的竞争条件的影响。
如果你的程序会打电话 fork
和 exec
,你真的应该打开所有的文件描述符 O_CLOEXEC
标志,所以你不必手动关闭它们 exec
。你也可以使用 fcntl
在打开文件后添加此标志,但这受多线程程序中的竞争条件的影响。
尝试关闭所有文件描述符可能听起来效率低下,但实际上并没有那么糟糕。如果系统有任何好处,那么查找文件描述符的系统调用实现应该是相当有效的。
如果要查找仅关闭打开的文件描述符,可以在存在它的系统上使用proc文件系统。例如。在Linux上,/ proc / self / fd将列出所有打开的文件描述符。迭代该目录,并关闭所有> 2,排除表示您正在迭代的目录的文件描述符。
在支持它的系统上(基本上是指Linux以外的任何unix),有closefrom(2)系统调用,专门为此目的而设计。