Piszę serwer, który musi obsłużyć wiele otwartych gniazd, więc używam setrlimit()
ustawić maksymalną liczbę otwartych deskryptorów (jako root, zanim przywilejów spada) tak:Czy można się spodziewać, że w Linuksie, fd <maksymalna liczba otwartych deskryptorów plików?
#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;
}
Teraz zdaj sobie sprawę, że prawdopodobnie nie będzie żadnych gwarancji i że jestem na łasce jakiejkolwiek metody używanej przez jądro Linux do implementacji tablic deskryptorów plików; ale w praktyce, czy można założyć, że każdy program otrzymany z jądra Linux ma wartość mniejszą od MAX_FD_C, którą ustawiłem powyżej?
Chciałbym, aby dane z jednego gniazda były jak najbardziej kompaktowe, co może oznaczać po prostu użycie tablicy jak np. static struct client clients[MAX_FD_C] = {{0}};
i użycie fd jako indeksu do struktury klienta (która byłaby zasadniczo moją własną wersją FDT).
Tak, deskryptory plików będą w zakresie 0 <= fd
Nie zakładaj niczego podczas programowania. To sprawia, że żyjesz dłużej. Poważnie. –
@RandyHoward: Myślę, że założenia są konieczne, aby utrzymać nas przy zdrowych zmysłach i wydajnie. –