2013-05-18 14 views
5

Sto scrivendo un server che deve gestire molti socket aperti, in modo da utilizzare setrlimit() per impostare il numero massimo di descrittori di file aperti (come root, prima di cadere privilegi) in questo modo:È ragionevole aspettarsi che in Linux, fd <numero massimo di descrittori di file aperti?

#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; 
} 

Ora, rendersi conto che probabilmente non ci saranno garanzie e che sono in balia di qualsiasi metodo venga usato dal kernel di Linux per implementare le tabelle dei descrittori di file; ma in pratica, è ragionevole supporre che ogni fd che questo programma riceve dal kernel di Linux avrà un valore inferiore al MAX_FD_C I impostato sopra?

Mi piacerebbe mantenere i dati per socket il più compatto possibile, il che potrebbe significare semplicemente utilizzare un array come static struct client clients[MAX_FD_C] = {{0}}; e utilizzare il fd come indice per la struttura del client (che sarebbe sostanzialmente la mia versione del FDT).

+1

Sì, i descrittori di file saranno compresi nell'intervallo 0 <= fd

+0

Non assumere nulla durante la programmazione. Ti fa vivere più a lungo. Sul serio. –

+0

@RandyHoward: Penso che siano necessarie supposizioni per mantenerci sani ed efficienti. –

risposta

3

Ci sono funzioni nello standard POSIX che lo assumono già. Date un'occhiata a FD_SETSIZE, select(), FD_SET.

+0

Grazie, è rassicurante. Puoi forse citare quale sezione (s) della documentazione rilevante rende quello più ovvio/esplicito? Lo sto cercando ora, ma non ne sono del tutto sicuro ... – Will

+0

Penso che sia questo dalla pagina man 'select': 'Un fd_set è un buffer di dimensioni fisse. L'esecuzione di FD_CLR() o FD_SET() con un valore di fd che è negativo o uguale o maggiore di FD_SETSIZE provocherà un comportamento non definito. Inoltre, POSIX richiede che fd sia un descrittore di file valido.? – Will

+0

@Will: si noti che questo non garantisce che non si possa mai ottenere un descrittore di file sopra 'FD_SETSIZE', ma' open' garantisce che il descrittore di file risultante sia "un piccolo numero intero" e che altre cose si interrompano quando non sono " t piccolo. Se lo desideri, puoi anche usare 'dup2' per spostare fds fuori range nell'intervallo (scegli una voce inutilizzata, ovviamente). –

Problemi correlati