Limit von FD_SETSIZE erhöhen und auswählen

Lesezeit: 7 Minuten

Benutzer-Avatar
Vivek Goel

Ich möchte den Makrowert FD_SETSIZE für mein System erhöhen. Gibt es eine Möglichkeit, FD_SETSIZE zu erhöhen, damit die Auswahl nicht fehlschlägt

  • ja, in meinem Fall brauche ich es etwa 2048 . Gibt es eine Möglichkeit es einzustellen?

    – Vivek Goel

    2. November 2011 um 6:07 Uhr

  • weil ich mein Serverlimit erhöhen möchte, um so viel Verbindung zu unterstützen.

    – Vivek Goel

    2. November 2011 um 6:55 Uhr

  • Nichts für ungut, aber über eine Erhöhung nachgedacht FD_SETSIZE ist eine ziemlich dumme Sache. 2048 gleichzeitige Verbindungen (oder besser gesagt mehr) liegen durchaus im Bereich, wo epoll_wait übertrifft beides deutlich select und poll einfach weil es muss nicht kopiert jedes Mal 8 Kilobyte an Daten und muss nicht jedes Mal über zweitausend Deskriptoren iterieren.

    – Dämon

    30. August 2013 um 13:22 Uhr


  • Echte Antwort ist: NEIN, nicht unter Linux. Für BSD und Windows ist es möglich, FD_SETSIZE neu zu definieren. Der Versuch, dies zu tun, erfordert Hacking und wird mit Sicherheit zu zukünftigen Problemen führen. Verwenden Sie daher lieber die Abfrage, wenn der maximale Deskriptorwert über 1024 liegen kann.

    – Philipp Lhardy

    15. Dezember 2013 um 21:08 Uhr

Benutzer-Avatar
R.. GitHub HÖREN SIE AUF, ICE ZU HELFEN

Gemäß den Standards gibt es keine Möglichkeit zu erhöhen FD_SETSIZE. Einige Programme und Bibliotheken (libevent kommt mir in den Sinn) versuchen dies zu umgehen, indem sie zusätzlichen Platz für die zuweisen fd_set Objekt und Übergabe von Werten größer als FD_SETSIZE zum FD_* Makros, aber das ist eine sehr schlechte Idee, da robuste Implementierungen eine Begrenzungsprüfung des Arguments durchführen und abbrechen können, wenn es außerhalb des Bereichs liegt.

Ich habe eine alternative Lösung, die immer funktionieren sollte (auch wenn die Standards dies nicht erfordern). Statt einer Single fd_set -Objekt, weisen Sie ein Array davon zu, das groß genug ist, um die maximale fd aufzunehmen, die Sie benötigen, und verwenden Sie es dann FD_SET(fd%FD_SETSIZE, &fds_array[fd/FD_SETSIZE]) usw., um auf das Set zuzugreifen.

  • @dns: Das ist eine falsche Dokumentation. 🙂 Lesen Sie bitte pubs.opengroup.org/onlinepubs/9699919799/functions/pselect.html. OK, Spaß beiseite, erkläre bitte, was du an meiner Antwort für “falsch” hältst.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    14. Mai 2013 um 14:15 Uhr


  • Laut Microsoft selbst ist “Nach den Standards gibt es keine Möglichkeit, FD_SETSIZE zu erhöhen” falsch, weil ich Wort für Wort von Microsoft selbst zitiere: “Dieser Wert wird beim Erstellen der fd_set-Strukturen verwendet, die in select () verwendet werden. Der Standardwert Der Wert in WINSOCK.H ist 64. Wenn eine Anwendung so konzipiert ist, dass sie mit mehr als 64 Sockets arbeiten kann, definieren Sie das Manifest FD_SETSIZE in jeder Quelldatei, bevor Sie WINSOCK.H einschließen. lesen Sie bitte support.microsoft.com/kb/111855

    – BrierMay

    11. August 2013 um 23:30 Uhr


  • ok gut, um den “Standards” zu entsprechen, können Sie es auch auf Linux/Unix/Mac-Varianten erhöhen, indem Sie einfach #define __FD_SETSIZE 1024 die folgenden 2 Dateien /usr/include/bits/typesizes.h /usr/include/linux ändern /posix_types.h Sie haben jedoch angegeben, dass Sie es nicht erhöhen können, und Sie können dies so oder so tun, die Antwort ist falsch

    – BrierMay

    13. August 2013 um 17:37 Uhr

  • Das ist auch nicht Standard. Das ist ein implementierungsspezifischer Hack. Ich stimme zu, dass Sie bei vielen Implementierungen einen implementierungsspezifischen Hack dieser Form machen können, aber es ist nicht korrekt nach den Standards.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    13. August 2013 um 17:41 Uhr

  • @AndrewHacking: Wann werden die Leute müde, falsche Kommentare dazu zu posten? Ja, einige Implementierungen erlauben dies. Nein, es ist gemäß der Spezifikation der Schnittstelle nicht gültig. Der entsprechende Text ist…

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    9. September 2014 um 15:03 Uhr

Ich empfehle auch die Verwendung poll wenn möglich. Und es gibt mehrere “Ereignis” -Verarbeitungsbibliotheken wie libevent oder libev (oder die Ereignisfähigkeiten von Glib von GTK, bzw QtCore, usw.), was Ihnen helfen sollte. Es gibt auch Dinge wie Epoll. Und Ihr Problem hängt damit zusammen C10k

  • Jawohl. Ich denke, das ist die ultimative Antwort. Wenn einer Ihrer überwachten Deskriptoren unter Linux über 1024 fällt, müssen Sie sich entweder durch die fd_set-Struktur HACKEN (und riskieren sowieso weitere Probleme), oder poll what is … besser verwenden.

    – Philipp Lhardy

    15. Dezember 2013 um 21:11 Uhr

  • Und Sie müssen beten, dass jede Bibliothek, die Sie benutzen, es richtig macht. Die einzige funktionierende Lösung, die mit 1024 Handles leben oder Ihren Programmcode einschließlich aller Bibliotheken zu 100 % verstehen und sicherstellen kann, dass “select” niemals verwendet wird.

    – Lothar

    24. November 2019 um 15:14 Uhr

Es wäre besser (und einfacher) durch poll zu ersetzen. Im Allgemeinen ist poll () ein einfacher Drop-in-Ersatz für select () und wird nicht durch die 1024 von FD_SETSIZE begrenzt …

fd_set fd_read;
int id = 42;
FD_ZERO(fd_read);
FD_SET(id, &fd_read);
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
if (select(id + 1, &fd_read, NULL, NULL, &tv) != 1) {
   // Error.
}

wird:

struct pollfd pfd_read;
int id = 42;
int timeout = 5000;
pfd_read.fd = id;
pfd_read.events = POLLIN;
if (poll(&pfd_read, 1, timeout) != 1) {
   // Error
}

Sie müssen poll.h für die pollfd-Struktur einschließen.

Wenn Sie sowohl schreiben als auch lesen müssen, setzen Sie das Ereignis-Flag auf POLLIN | POLOUT.

Benutzer-Avatar
mpromonet

Um a fd_set größer als FD_SETSIZE, ist es möglich, eine erweiterte wie folgt zu definieren:

#include <sys/select.h>
#include <stdio.h>

#define EXT_FD_SETSIZE 2048
typedef struct
{
    long __fds_bits[EXT_FD_SETSIZE / 8 / sizeof(long)];
} ext_fd_set;

int main()
{
    ext_fd_set fd;
    int s;
    printf("FD_SETSIZE:%d sizeof(fd):%ld\n", EXT_FD_SETSIZE, sizeof(fd));
    FD_ZERO(&fd);
    while ( ((s=dup(0)) != -1) && (s < EXT_FD_SETSIZE) )
    {
        FD_SET(s, &fd);
    }
    printf("select:%d\n", select(EXT_FD_SETSIZE,(fd_set*)&fd, NULL, NULL, NULL));
    return 0;
}

Das druckt:

FD_SETSIZE:2048 sizeof(fd):256

wählen:2045


Um mehr als 1024 Dateideskriptoren zu öffnen, ist es erforderlich, das Limit zu erhöhen, indem Sie beispielsweise verwenden ulimit -n 2048.

Benutzer-Avatar
BrierMay

Eigentlich da IST ein Weg zur Steigerung FD_SETSIZE unter Windows. Es ist definiert in winsock.h und pro Microsoft selbst können Sie es erhöhen, indem Sie es einfach definieren, BEVOR Sie es einschließen winsock.h:

Sehen Maximale Anzahl von Sockets, die eine Anwendung verwenden kann (alter Link) oder die neuere Seite Maximale Anzahl unterstützter Sockets.

Ich mache das immer und habe keine Probleme. Der größte Wert, den ich verwendet habe, war ungefähr 5000 für einen Server, den ich entwickelt habe.

  • BSD und Windows erlauben das Setzen von FD_SETSIZE. Nicht Linux, wo die interne Größe von fd_set tatsächlich durch __FD_SETSIZE festgelegt wird, das fest auf 1024 codiert ist. Für Linux ist es besser, poll zu verwenden, da slecet nicht für mehr als die ersten 1024 Deskriptoren funktionieren kann. Tatsächlich kann es so aussehen, als ob es unter Linux funktioniert, aber Bits außerhalb des zugewiesenen fd_set verwenden, was mit Sicherheit den Stapel beschädigen und Abstürze verursachen wird. Aus diesem Grund lautet die aktuelle Antwort, sich mehr Platz auf dem Stapel zuzuweisen, was nicht sehr schön ist.

    – Philipp Lhardy

    15. Dezember 2013 um 21:02 Uhr

  • Die Frage befasst sich mit Linux, nicht mit Windows.

    – mpromonet

    10. Januar 2015 um 14:18 Uhr

  • Hier wird es auch erwähnt: docs.microsoft.com/en-us/windows/win32/api/winsock2/… (Strg+F ‘FD_SETSIZE’)

    – Tom

    25. Juni 2021 um 12:12 Uhr


  • BSD und Windows erlauben das Setzen von FD_SETSIZE. Nicht Linux, wo die interne Größe von fd_set tatsächlich durch __FD_SETSIZE festgelegt wird, das fest auf 1024 codiert ist. Für Linux ist es besser, poll zu verwenden, da slecet nicht für mehr als die ersten 1024 Deskriptoren funktionieren kann. Tatsächlich kann es so aussehen, als ob es unter Linux funktioniert, aber Bits außerhalb des zugewiesenen fd_set verwenden, was mit Sicherheit den Stapel beschädigen und Abstürze verursachen wird. Aus diesem Grund lautet die aktuelle Antwort, sich mehr Platz auf dem Stapel zuzuweisen, was nicht sehr schön ist.

    – Philipp Lhardy

    15. Dezember 2013 um 21:02 Uhr

  • Die Frage befasst sich mit Linux, nicht mit Windows.

    – mpromonet

    10. Januar 2015 um 14:18 Uhr

  • Hier wird es auch erwähnt: docs.microsoft.com/en-us/windows/win32/api/winsock2/… (Strg+F ‘FD_SETSIZE’)

    – Tom

    25. Juni 2021 um 12:12 Uhr


1185820cookie-checkLimit von FD_SETSIZE erhöhen und auswählen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy