nftw
需要一個文件句柄數量的參數,並且似乎沒有辦法說'儘可能多'。指定255似乎適用於Linux,但在BSD上失敗。顯然OPEN_MAX是BSD推薦的解決方案,但是我不能使用它,因爲它在Linux上不起作用。OPEN_MAX的便攜式等效物
是否有一個可在Linux和BSD上工作的便攜式OPEN_MAX?
另外,是否有一個便攜式號碼,有些號碼足夠大以至於不會減慢速度,對於實際用途來說是便攜式的(理想情況下在POSIX中指定,或者至少適用於每個類似Unix的系統並具有顯着的市場份額)?
nftw
需要一個文件句柄數量的參數,並且似乎沒有辦法說'儘可能多'。指定255似乎適用於Linux,但在BSD上失敗。顯然OPEN_MAX是BSD推薦的解決方案,但是我不能使用它,因爲它在Linux上不起作用。OPEN_MAX的便攜式等效物
是否有一個可在Linux和BSD上工作的便攜式OPEN_MAX?
另外,是否有一個便攜式號碼,有些號碼足夠大以至於不會減慢速度,對於實際用途來說是便攜式的(理想情況下在POSIX中指定,或者至少適用於每個類似Unix的系統並具有顯着的市場份額)?
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
頭與源提供的 - 應該很容易編寫你的日常更換。)
請參閱getdtablesize
。它具有一致性注意事項:
SVr4,4.4BSD(getdtablesize()函數首次出現在4.2BSD中)。在POSIX.1-2001中沒有規定;可移植應用程序應該使用sysconf(_SC_OPEN_MAX)而不是此調用。
它甚至檢查rlimits。尼斯。 :) – sarnold
恕我直言getrlimit()是getdtablesize的POSIX等價物 – wildplasser