|
|
Beschreibung
Die Funktion select() überprüft drei verschiedene Mengen von Socket-Deskriptoren, die mit den Parametern readfds, writefds und exceptfds übergeben werden.
Weitere allgemeine Informationen zu dieser Funktion finden Sie im Handbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen".
select() stellt fest,
welche Deskriptoren der mit readfds übergebenen Menge bereit zum Lesen sind,
welche Deskriptoren der mit writefds übergebenen Menge bereit zum Schreiben sind,
für welche Deskriptoren der mit exceptfds übergebenen Menge eine noch nicht ausgewertete Ausnahmebedingung vorliegt.
Die Deskriptormengen werden als Bitfelder in Integer-Reihungen abgespeichert. Die Größe der Bitfelder und somit auch die Größe der Deskriptormengen ist durch die Konstante FD_SETSIZE festgelegt. FD_SETSIZE ist in <sys/select.h> mit einem Wert definiert, der mindestens so groß ist wie die maximale Anzahl der vom System unterstützten Deskriptoren.
Der Parameter width gibt an, wie viele Bits in jeder Bitmaske zu prüfen sind. select() prüft in jeder Bitmaske die Bits 0 bis width-1. Im Standardfall hat width den Wert, der von der Funktion ulimit() als die maximale Anzahl von Socket-Deskriptoren geliefert wird. Die Funktion ulimit() ist beschrieben im Handbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen".
select() ersetzt die beim Aufruf übergebenen Deskriptormengen durch entsprechende Untermengen. Diese Untermengen enthalten jeweils alle Deskriptoren, die für die betreffende Operation bereit sind.
Mit den folgenden Makros können Sie Bitmasken bzw. Deskriptormengen manipulieren oder prüfen:
FD_ZERO(&fdset)
Initialisiert die Deskriptormenge fdset als leere Menge.
FD_SET(fd, &fdset)
Erweitert die Deskriptormenge fdset um den Deskriptor fd.
FD_CLR(fd, &fdset)
Entfernt den Deskriptor fd aus der Deskriptormenge fdset.
FD_ISSET(fd, &fdset)
Prüft, ob der Deskriptor fd ein Element der Deskriptormenge fdset ist:
Rückgabewert != 0:
Rückgabewert == 0: fd ist nicht Element von fdset.
Das Verhalten dieser Makros ist undefiniert, wenn der Deskriptor-Wert <0 oder ≥ FD_SETSIZE ist.
Der Parameter timeout legt die maximale Zeitspanne fest, die der Funktion select() für die Auswahl der bereiten Deskriptoren zur Verfügung steht. Wenn timeout der Null-Zeiger ist, blockiert select() auf unbestimmte Zeit. Ein zyklisches Auswählen (Polling) können Sie veranlassen, wenn Sie für timeout einen Zeiger auf ein timeval-Objekt übergeben, dessen Komponenten sämtlich den Wert 0 haben.
Wenn keine Deskriptoren von Interesse sind, kann als aktueller Parameter für readfds, writefds oder exceptfds der Null-Zeiger übergeben werden.
Stellt select() nach einem Aufruf von listen() die Lesebereitschaft eines Socket-Deskriptors fest, so zeigt dies an, dass ein folgender accept()-Aufruf für diesen Deskriptor nicht blockieren wird.
Returnwert
>0:
Der positive Wert gibt die Anzahl der bereiten Deskriptoren in den Deskriptormengen an.
0:
Gibt an, dass das Timeout-Limit überschritten wurde.
-1:
Bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen. Die Deskriptormengen sind in diesem Fall nicht verändert.
Fehler
EBADF
Eine der Deskriptormengen spezifiziert einen ungültigen Deskriptor.
EFAULT
Einer der Zeiger, die übergeben wurden, zeigt auf einen nicht vorhandenen Bereich im Prozess-Adressbereich.
EINTR
Es wurde ein Signal empfangen, bevor eines der ausgewählten Ereignisse eintraf oder bevor die Zeitbegrenzung abgelaufen ist.
EINVAL
Eine Komponente der angegebenen Zeitbegrenzung liegt außerhalb des gültigen Bereichs.
Der gültige Bereich ist wie folgt festgelegt:
0 <= t_sec <= 10 8
0 <= t_usec < 10 6
Hinweis
In seltenen Fällen kann select() anzeigen, dass ein Deskriptor bereit zum Schreiben ist, während ein Schreibversuch tatsächlich aber blockieren würde. Das kann vorkommen, wenn für das Schreiben notwendige System-Ressourcen erschöpft oder nicht vorhanden sind. Wenn es für Ihre Anwendung kritisch ist, dass Schreiboperationen auf einen Dateideskriptor niemals blockieren, sollten Sie den Deskriptor mit einem fcntl()-Aufruf auf nicht-blockierende Ein-/Ausgabe setzen.
Siehe auch
accept() , connect(), listen(), recv(), send(), fcntl(), read(), write(), ulimit() in "C-Bibliotheksfunktionen für POSIX-Anwendungen"