2

nftw想要一个用于使用文件句柄数量的参数,并且似乎没有办法说“尽可能多”。指定 255 似乎在 Linux 上有效,但在 BSD 上失败。显然 OPEN_MAX 是 BSD 上的推荐解决方案,但我不能使用它,因为它不适用于 Linux。

是否有可以在 Linux 和 BSD 上运行的便携式等效 OPEN_MAX?

或者,是否有一个可移植的数字,某个数字足够大,不会减慢速度,可移植用于实际目的(理想情况下在 POSIX 中指定,或者至少可以在每个具有显着市场份额的类 Unix 系统上工作)?

4

2 回答 2

5

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标题中提供 - 应该很容易为您的例程编写替代代码。)

于 2011-11-22T10:24:06.063 回答
2

getdtablesize。它有一个一致性说明:

SVr4、4.4BSD(getdtablesize() 函数最早出现在 4.2BSD)。POSIX.1-2001 中未指定;可移植应用程序应该使用 sysconf(_SC_OPEN_MAX) 而不是这个调用。

于 2011-11-22T10:23:29.183 回答