2013-05-18 5 views
5

Ich schreibe einen Server, der viele offene Steckdosen verarbeiten muss, so dass ich setrlimit() die maximale Anzahl offener Dateien setzen (als root, vor dem Ablegen Privilegien) wie folgt:Ist es vernünftig zu erwarten, dass in Linux, fd <maximale Anzahl von offenen Dateideskriptoren?

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

Nun, ich realisiere, dass es wahrscheinlich keine Garantien gibt und dass ich der Methode ausgeliefert bin, mit der der Linux-Kernel Dateideskriptortabellen implementiert; Aber ist es in der Praxis vernünftig anzunehmen, dass jedes fd, das dieses Programm vom Linux-Kernel erhält, einen Wert hat, der kleiner ist als das oben angegebene MAX_FD_C?

Ich möchte pro Socket Daten so kompakt wie möglich halten, was einfach bedeuten könnte, ein Array wie static struct client clients[MAX_FD_C] = {{0}}; und die Verwendung der Fd als Index für die Client-Struktur (die im Grunde meine eigene Version der FDT wäre).

+1

Ja, Dateideskriptoren liegen im Bereich 0 <= fd

+0

Nimm während der Programmierung nichts an. Es lässt dich länger leben. Ernst. –

+0

@RandyHoward: Ich denke, Annahmen sind notwendig, um uns gesund und effizient zu halten. –

Antwort

3

Es gibt Funktionen im POSIX-Standard, die dies bereits übernehmen. Schauen Sie sich FD_SETSIZE, select(), FD_SET.

+0

Danke, das ist beruhigend. Können Sie vielleicht angeben, welche Abschnitte der relevanten Dokumentation das Offensichtlichste/Expliziteste machen? Ich suche es jetzt, aber ich bin mir nicht ganz sicher ... – Will

+0

Ich denke, es ist das von der 'select' Manpage:' Ein fd_set ist ein Fixed-Size-Buffer. Die Ausführung von FD_CLR() oder FD_SET() mit einem Wert von fd, der negativ ist oder gleich oder größer als FD_SETSIZE ist, führt zu undefiniertem Verhalten. Darüber hinaus erfordert POSIX, dass fd ein gültiger Dateideskriptor ist. – Will

+0

@Will: Beachten Sie, dass dies nicht garantiert, dass Sie niemals einen Dateideskriptor über "FD_SETSIZE" erhalten, aber "open" garantiert, dass der resultierende Dateideskriptor "eine kleine ganze Zahl" ist und andere Dinge brechen, wenn sie nicht 'sind t klein. Wenn Sie möchten, können Sie auch 'dup2' verwenden, um fds außerhalb des Bereichs in den Bereich zu verschieben (wählen Sie natürlich einen nicht verwendeten Eintrag). –

Verwandte Themen