如何找到进程中的所有打开文件(来自内部)?
在fork()
之前(exec()
之前)知道这一点似乎很有用。
我知道getdtablesize()
的存在性和更可移植的sysconf(_SC_OPEN_MAX)
,但尝试关闭每个有效的文件描述符似乎效率低下,无论是否有一个打开的文件或不。 (我也意识到过早优化的危险,我想更多的是关于美学: - )
答案 0 :(得分:8)
如果你的程序将调用fork
和exec
,你真的应该用O_CLOEXEC
标志打开所有文件描述符,这样你就不必在{{1}之前手动关闭它们}}。您也可以在打开文件后使用exec
添加此标志,但这受多线程程序中的竞争条件限制。
答案 1 :(得分:5)
尝试关闭所有文件描述符可能听起来效率低,但实际上并没有那么糟糕。如果系统是好的,系统调用实现来查找文件描述符应该是相当有效的。
如果要查找仅关闭打开的文件描述符,可以在存在的系统上使用proc文件系统。例如。在Linux上,/ proc / self / fd将列出所有打开的文件描述符。迭代该目录,并关闭所有> 2,排除表示您正在迭代的目录的文件描述符。
答案 2 :(得分:2)
花了很多时间来跟踪错误,是的,关闭所有文件描述符可能会导致问题。
问题是,有多少个文件描述符?
1024曾经很常见,并且1024不是完全不合理的要关闭的文件句柄数。由于大多数都是关闭的,因此只检查内存中的一个字节。
我的操作系统出厂默认值为1,048,576。在这个(速度很慢)服务器上,尝试关闭文件句柄显然需要4.7微秒以上的时间。这导致超时(5秒)。而且,并没有说这个数字会增长多少。至少要对其设置一个(合理的)上限。
/ proc / self / fd并不理想,但是很难找到这样的错误。
答案 3 :(得分:1)
在支持它的系统(基本上意味着Linux以外的任何unix)上,都有closefrom(2)系统调用,专门为此目的而设计。