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


如何在进程中找到所有打开的文件(从内部本身)?

这一点似乎很有用 fork() (之前 exec())。

我知道存在的 getdtablesize() 而且更便携 sysconf(_SC_OPEN_MAX),但尝试关闭每一个似乎效率低下 有效 文件描述符,是否有一个打开的文件。 (我也意识到过早优化的危险,这更多是关于我认为的美学:-)


5386
2017-08-22 07:22


起源



答案:


如果你的程序会打电话 fork 和 exec,你真的应该打开所有的文件描述符 O_CLOEXEC 标志,所以你不必手动关闭它们 exec。你也可以使用 fcntl 在打开文件后添加此标志,但这受多线程程序中的竞争条件的影响。


8
2018-06-29 21:33



欢迎参加比赛。 - ybungalobill


答案:


如果你的程序会打电话 fork 和 exec,你真的应该打开所有的文件描述符 O_CLOEXEC 标志,所以你不必手动关闭它们 exec。你也可以使用 fcntl 在打开文件后添加此标志,但这受多线程程序中的竞争条件的影响。


8
2018-06-29 21:33



欢迎参加比赛。 - ybungalobill


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

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


4
2017-08-22 07:34





在支持它的系统上(基本上是指Linux以外的任何unix),有closefrom(2)系统调用,专门为此目的而设计。


0
2017-08-31 15:44