Programme, die dabei auch weiterlaufen wollen Das Lesen interaktiver Benutzereingaben muss 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 bestimmen, ob Eingaben gelesen werden können, ohne die gesamte Anwendung zu blockieren.
Die 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 read()
ausführen 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, die select()
verwenden möchte nicht so blockiert werden.
Sie fragen auch:
Warum müssen wir den Dateideskriptor um 1 erhöhen und übergeben, während ich den bereits auf select
gesetzten Dateideskriptor übergebe ?
Das gibt wahrscheinlich die Größe des FD_SET an. Das erste Argument für select()
ist als nfds
bekannt und POSIX sagt:
Die nfds
Argument gibt den Bereich der zu testenden Deskriptoren an. Die erste nfds
Deskriptoren sind in jedem Satz zu prüfen; das heißt, die Deskriptoren von 0 bis nfds-1
in den Deskriptorsätzen untersucht werden.
Also, um einen Dateideskriptor n
zu testen , der Wert in nfds
muss mindestens n+1
sein .
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 das IO (z. B. read() ) nicht blockiert, lesen Sie die :Manpage
Lesen Sie auch die zugehörigen APIs