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