2011-11-22 67 views
2

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

是否有一个可在Linux和BSD上工作的便携式OPEN_MAX?

另外,是否有一个便携式号码,有些号码足够大以至于不会减慢速度,对于实际用途来说是便携式的(理想情况下在POSIX中指定,或者至少适用于每个类似Unix的系统并具有显着的市场份额)?

回答

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头与源提供的 - 应该很容易编写你的日常更换。)

2

请参阅getdtablesize。它具有一致性注意事项:

SVr4,4.4BSD(getdtablesize()函数首次出现在4.2BSD中)。在POSIX.1-2001中没有规定;可移植应用程序应该使用sysconf(_SC_OPEN_MAX)而不是此调用。

+0

它甚至检查rlimits。尼斯。 :) – sarnold

+1

恕我直言getrlimit()是getdtablesize的POSIX等价物 – wildplasser