2

nftw使用するファイルハンドルの数のパラメーターが必要であり、「できるだけ多く」と言う方法がないようです。255 を指定すると、Linux では機能するように見えますが、BSD では失敗します。どうやら OPEN_MAX は BSD で推奨されるソリューションですが、Linux では動作しないため使用できません。

Linux と BSD の両方で動作する、移植可能な OPEN_MAX に相当するものはありますか?

あるいは、実用的な目的のために移植可能な移植可能な数値、速度を落とさないのに十分な大きさの数値はありますか (理想的には POSIX で指定されているか、少なくとも重要な市場シェアを持つすべての Unix のようなシステムで動作します)。

4

2 に答える 2

5

Advanced Programming in the Unix Env​​ironment, 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ます -- ルーチンの置き換えを簡単にコーディングできるはずです。)

于 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 に答える