如何枚举文件描述符? (在叉子后关闭它们)

时间:2014-04-12 16:40:01

标签: c linux macos fork posix

我有一个大型计划。它非常喜欢打开文件(与它们一起使用,数量可能很大 - 超过10k)。在某些时候,我想要诞生一个子流程,它将过着自己的生活(流程外的Web浏览器)。我无法控制由于其大小(大约10GB的代码)和第三方(插件)依赖项而在主程序中创建文件的人和方式。我也想要:

  • 默认情况下为O_CLOEXEC / FD_CLOEXEC。我怀疑没有这样的能力。或
  • 一种枚举所有文件(套接字,管道等)描述符的方法,以便能够在fork之后关闭它们。感兴趣的操作系统:Mac OS X和Linux。

2 个答案:

答案 0 :(得分:3)

文件描述符都是小正整数,因此您可以枚举所有这些并关闭它们。关闭一个未打开的将导致错误,但您可以忽略:

#include <sys/resource.h>
struct rlimit lim;
getrlimit(RLIMIT_NOFILE, &lim);
for (int i = 3; i < lim.rlim_cur; i++)
    close(i);   // close all file descriptors other that stdin/stdout/stderr

答案 1 :(得分:1)

默认设置close-on-exec是不可能的。(相关:how to set close-on-exec by default)。

枚举进程中的所有文件描述符,您可以在Linux中查找/proc/PID/fd/。 但是在Mac OS X中,除了使用lsof(8)实用程序之外,我没有任何编程解决方案。 lsof(8)也可以在Linux上使用。

编辑: 或者,您可以覆盖open(2)调用以默认指定O_CLOSEXEC,并在Linux上使用LD_PRELOAD运行程序。 对于Mac,请按What is the exact equivalent to LD_PRELOAD on OSX?