nftw想要一个用于使用文件句柄数量的参数,并且似乎没有办法说“尽可能多”。指定 255 似乎在 Linux 上有效,但在 BSD 上失败。显然 OPEN_MAX 是 BSD 上的推荐解决方案,但我不能使用它,因为它不适用于 Linux。
是否有可以在 Linux 和 BSD 上运行的便携式等效 OPEN_MAX?
或者,是否有一个可移植的数字,某个数字足够大,不会减慢速度,可移植用于实际目的(理想情况下在 POSIX 中指定,或者至少可以在每个具有显着市场份额的类 Unix 系统上工作)?
Unix 环境中的高级编程,第 2 版为我们提供了以下应该可以在任何地方工作的代码;虽然它非常聪明,但我认为有点不幸的是它并没有检查进程的 rlimits,因为 rlimits 可以进一步限制进程可以使用多少打开文件。除此之外,这是来自The Master的代码:
#ifdef OPEN_MAX
static long openmax = OPEN_MAX;
#else
static long openmax = 0;
#endif
/*
* If OPEN_MAX is indeterminate, we're not
* guaranteed that this is adequate.
*/
#define OPEN_MAX_GUESS 256
long
open_max(void)
{
if (openmax == 0) { /* first time through */
errno = 0;
if ((openmax = sysconf(_SC_OPEN_MAX)) < 0) {
if (errno == 0)
openmax = OPEN_MAX_GUESS; /* it's indeterminate */
else
err_sys("sysconf error for _SC_OPEN_MAX");
}
}
return(openmax);
}
(在源代码err_sys()的apue.h标题中提供 - 应该很容易为您的例程编写替代代码。)
见getdtablesize。它有一个一致性说明:
SVr4、4.4BSD(getdtablesize() 函数最早出现在 4.2BSD)。POSIX.1-2001 中未指定;可移植应用程序应该使用 sysconf(_SC_OPEN_MAX) 而不是这个调用。