Warum wird select unter Linux verwendet

Lesezeit: 4 Minuten

Benutzeravatar von user1667307
Benutzer1667307

Ich habe ein serielles Programm durchlaufen und festgestellt, dass sie es verwenden select() vor Gebrauch read(). Warum genau ist dies erforderlich. Warum können wir nicht einfach direkt anrufen read() und überprüfen, ob es fehlschlägt oder nicht? Warum müssen wir auch den Dateideskriptor um 1 erhöhen und übergeben, während ich den bereits festgelegten Dateideskriptor übergebe? select()?

Beispiel:

r=select(fd+1, &fds, NULL, NULL, &timeout);

wobei fds bereits den Wert von fd hat

  • Ein Anruf bei read(2) kann blockieren. Lesen Sie auch darüber poll(2) syscall (was besser ist als select(2) für Multiplexing-Zwecke; lesen Sie mehr über die C10K-Problem).

    – Basile Starynkevitch

    27. Januar 2013 um 7:52 Uhr

  • @basile: was meinst du mit “multiplexingzwecken”?

    – Darschan L

    27. Juli 2018 um 18:00 Uhr

  • Beide Umfrage(2) und das alte auswählen(2) warten und Multiplexing an mehrere Dateideskriptoren. Ihre Rolle ist konzeptionell ähnlich (aber poll ist C10K-freundlicher, da es in der Lage ist, mehr als 1024 Dateideskriptoren zu multiplexen).

    – Basile Starynkevitch

    27. Juli 2018 um 19:42 Uhr


Benutzeravatar von Jonathan Leffler
Jonathan Leffler

Das select() Der Systemaufruf teilt Ihnen mit, ob in den Dateideskriptoren Daten zu lesen sind, an denen Sie interessiert sind. Streng genommen ist es eine Frage, ob eine Leseoperation für den Dateideskriptor blockiert oder nicht.

Wenn Sie ausführen read() auf einem Dateideskriptor – wie dem, der mit einer seriellen Schnittstelle verbunden ist – und es gibt keine zu lesenden Daten, dann bleibt der Aufruf hängen, bis einige Daten zu lesen sind. Programme verwenden select() möchte nicht so blockiert werden.

Du fragst auch:

Warum müssen wir den Dateideskriptor um 1 erhöhen und übergeben, während ich den bereits gesetzten Dateideskriptor übergebe select?

Das gibt wahrscheinlich die Größe des FD_SET an. Das erste Argument zu select() ist bekannt als nfds und POSIX sagt:

Das nfds Argument gibt den Bereich der zu testenden Deskriptoren an. Der Erste nfds Deskriptoren sind in jedem Satz zu prüfen; das heißt, die Deskriptoren von Null bis nfds-1 in den Deskriptorsätzen untersucht werden.

Also, um einen Dateideskriptor zu testen nder Wert in nfds muss mindestens n+1.

  • manpages.courier-mta.org/htmlman2/select.2.html wobei wir nfds als ersten Parameter übergeben müssen. Was den ersten Teil betrifft, verstehe ich jetzt

    – Benutzer1667307

    27. Januar 2013 um 5:20 Uhr


  • Die Anzahl der Dateideskriptoren muss mit der Anzahl der Elemente im Array von Dateihandles übereinstimmen, die im zweiten Parameter übergeben werden. Das Übergeben einer großen Anzahl wird möglicherweise nicht fehlschlagen, kann aber durchaus zu interessanten ungültigen Speicherzugriffen führen.

    – Pekka

    27. Januar 2013 um 22:25 Uhr

  • @Jonathan Leffler ein beliebiges Beispiel für ein einfaches Verständnis der Auswahlfunktion.

    – Kalanidhi

    23. Januar 2014 um 6:06 Uhr

  • Nicht wirklich; Es ist keine leicht zu verstehende Funktion. Es hat eine der komplexesten Schnittstellen aller Systemaufrufe in Unix. Sie können sich ansehen, ob es notwendig ist, das FD-Set zwischendurch zurückzusetzen select() Systemaufrufe?; Sie könnten sich ansehen, ob es Plattformen gibt, auf denen die Strukturkopie auf einem FD-Set verwendet wird (z select() oder pselect()) verursacht Probleme?. Sie können nach anderen Fragen zu SO suchen, indem Sie ‘[c] auswählen’.

    – Jonathan Leffler

    23. Januar 2014 um 6:13 Uhr

  • Es sollte beachtet werden, dass es auch das O_NONBLOCK-Flag gibt, um nicht blockierende IO auszuführen

    – Mike76

    14. Dezember 2016 um 14:02 Uhr

Programme, die währenddessen weiterlaufen wollen Auch Lesen interaktiver Benutzereingaben1 müssen multithreaded sein oder Sie müssen Eingabeströme sorgfältig und insbesondere bedingt lesen.

Select(2) kann verwendet werden, um das zweite Entwurfsmuster zu implementieren. Es kann feststellen, ob Eingaben gelesen werden können, ohne die gesamte Anwendung zu blockieren.


1. Oder eine andere Eingabe, die unvorhersehbar eintrifft.

  • Und Sie können auch verwenden poll(2)

    – Basile Starynkevitch

    27. Januar 2013 um 7:53 Uhr

  • Warum funktioniert diese Antwort und die vorherige Kommentarfunktion (2) ? Was bedeutet dies? Ich denke entweder an ein Argument, das übergeben wird, oder an “Lesen Sie die zweite Definition” (wie ein englisches Wörterbuch mehrere Bedeutungen / Verwendungen für dasselbe Wort haben kann).

    – nmz787

    20. März 2018 um 0:59 Uhr

  • Die Zahl bezeichnet einen Handbuchabschnitt: unix.stackexchange.com/questions/3586/…

    – Bohrax

    20. August 2018 um 11:49 Uhr


Sie verwenden select call, wenn Sie Dateideskriptoren ständig überwachen müssen, bis sie für einige IO bereit sind, ohne zu blockieren.

Wird im Allgemeinen verwendet, wenn Sie möchten, dass die IO (z. B. read() ) nicht blockiert, lesen Sie die:Manpage

Lesen Sie auch die zugehörigen APIs

1398650cookie-checkWarum wird select unter Linux verwendet

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

Privacy policy