2011-11-22 68 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