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
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.
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).
Ein Anruf bei
read(2)
kann blockieren. Lesen Sie auch darüberpoll(2)
syscall (was besser ist alsselect(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