2013-05-18 14 views
5

ので、私は多くのオープンソケットを処理する必要があるサーバーを書いているので、私は(権限を削除する前に、rootとして)オープンファイル記述子の最大数を設定するsetrlimit()を使用してのような:今Linuxでは、fd <オープンファイル記述子の最大数を期待するのは妥当ですか?

#include <sys/resource.h> 
#define MAX_FD_C 9001 

if (setrlimit(
     RLIMIT_NOFILE, &(struct rlimit){.rlim_cur = MAX_FD_C, .rlim_max = MAX_FD_C} 
    ) == -1) { 
    perror("Failed to set the maximum number of open file descriptors"); 
    return EXIT_FAILURE; 
} 

、私はLinuxカーネルがファイル記述子テーブルを実装するためにどのようなメソッドを使用していても、私はそれが保証されていないことを認識しています。実際には、このプログラムがLinuxカーネルから受け取るfdが上記のMAX_FD_Cより小さい値を持つと仮定することは合理的ですか?

ソケットデータをできるだけコンパクトに保ちたいのですが、単純にstatic struct client clients[MAX_FD_C] = {{0}};のような配列を使用し、fdをクライアント構造体のインデックス(基本的にはFDTの独自のバージョン)とすることができます。

+1

はい、ファイル記述子は0 <= fd

+0

プログラミング中は何も想定しないでください。それはあなたが長く生きるようにします。真剣に。 –

+0

@RandyHoward:われわれは、われわれを正気で効率的に保つためには前提が必要だと思う。 –

答えて

3

POSIX規格にはすでにこれを想定した関数があります。 FD_SETSIZEselect()FD_SETをご覧ください。

+0

ありがとうございます、それは安心です。関連するドキュメントのどのセクションをもっとも明白に/明示的にしているのか、あなたはたぶん引用できますか?私は今それを探していますが、私は確信していません... – Will

+0

これは 'select'のマニュアルページから推測します:' fd_setは固定サイズのバッファです。 FD_CLR()またはFD_SET()の値が負であるか、FD_SETSIZE以上であると、未定義の動作になります。さらにPOSIXでは、fdを有効なファイル記述子にする必要があります。 – Will

+0

@Will:これは 'FD_SETSIZE'の上にファイル記述子を得ることができないことを保証するものではありませんが、' open'は生成されたファイル記述子が「小さな整数」であることを保証し、小さい。あなたが好きなら、 'dup2'を使って範囲外のfdを範囲に移動することもできます(明らかに未使用の項目を選ぶ)。 –

関連する問題