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).
Sì, i descrittori di file saranno compresi nell'intervallo 0 <= fd
Non assumere nulla durante la programmazione. Ti fa vivere più a lungo. Sul serio. –
@RandyHoward: Penso che siano necessarie supposizioni per mantenerci sani ed efficienti. –