私は多くの開いているソケットを処理する必要があるサーバーを書いているので、次のようにsetrlimit()
開いているファイル記述子の最大数を (ルートとして、権限を削除する前に) 設定するために使用します。
#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 の独自のバージョンになります)。