便携式等效的OPEN_MAX

时间:2011-11-22 10:19:56

标签: c linux posix bsd

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

OPEN_MAX是否可以在Linux和BSD上同时运行?

或者,是否有一个便携式号码,一些数字足够大,不会减慢速度,可移植用于实际目的(理想情况下在POSIX中指定,或者至少适用于具有大量市场份额的每个类似Unix的系统) ?

2 个答案:

答案 0 :(得分:4)

Advanced Programming in the Unix Environment, 2nd Ed为我们提供了以下代码:虽然它非常聪明,但我认为它有点不幸它检查进程的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来源 - 应该很容易为您的例程代替替换。)

答案 1 :(得分:2)

getdtablesize。它有一致性说明:

  

SVr4,4.4BSD(getdtablesize()函数首次出现在4.2BSD中)。它没有在POSIX.1-2001中指定;便携式应用程序应使用sysconf(_SC_OPEN_MAX)而不是此调用。