2013-05-18 9 views
5

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).

+1

Tak, deskryptory plików będą w zakresie 0 <= fd

+0

Nie zakładaj niczego podczas programowania. To sprawia, że ​​żyjesz dłużej. Poważnie. –

+0

@RandyHoward: Myślę, że założenia są konieczne, aby utrzymać nas przy zdrowych zmysłach i wydajnie. –

Odpowiedz

3

Istnieją funkcje w standardzie POSIX, które zakładają to już. Spójrz na FD_SETSIZE, select(), FD_SET.

+0

Dzięki, to uspokajające. Czy możesz przytoczyć fragmenty odpowiedniej dokumentacji, które są najbardziej oczywiste? Szukam tego teraz, ale nie jestem całkiem pewien ... – Will

+0

Domyślam się, że to na stronie 'select' man:' Fd_set to bufor o stałym rozmiarze. Wykonywanie FD_CLR() lub FD_SET() z wartością fd, która jest ujemna lub jest równa lub większa niż FD_SETSIZE, spowoduje niezdefiniowane zachowanie. Co więcej, POSIX wymaga, aby fd był prawidłowym deskryptorem pliku. " – Will

+0

@Will: Zauważ, że to nie gwarantuje, że nigdy nie dostaniesz deskryptora pliku powyżej 'FD_SETSIZE', ale' open' gwarantuje, że wynikowy deskryptor pliku jest "małą liczbą całkowitą", a inne rzeczy ulegają zerwaniu, gdy nie są " t małe. Jeśli chcesz, możesz również użyć 'dup2', aby przenieść fds poza zasięg do zakresu (oczywiście wybierz nieużywany wpis). –

Powiązane problemy