Definition | #include <sys/time.h> int select ( int nfds, fd_set *readfds, fd_set *writefds, fd_set *execptfds, struct timeval *timeout); void FD_CLR(int fd, fd_set *fdset); int FD_ISSET(int fd, fd_set *fdset); void FD_SET(int fd, fd_set *fdset); void FD_ZERO(fd_set *fdset); |
Beschreibung | select überprüft die E/A-Deskriptormengen, die in readfds, writefds und execptfds übergeben werden, um zu sehen, ob einer ihrer Deskriptoren bereit fürs Lesen oder fürs Schreiben ist, oder eine noch nicht ausgewertete Ausnahmebedingung besitzt. nfds ist die Anzahl der Bits, die in jeder Bitmaske überprüft werden sollen, die eine Dateideskriptormenge darstellt. Die Deskriptoren der Deskriptormengen werden von 0 bis nfds-1 überprüft. Beim Rücksprung ersetzt select die gegebene Deskriptormenge durch Untermengen, die aus den Deskriptoren bestehen, die für die gewünschte Operation bereit sind. Der Rückgabewert von dem select() -Aufruf ist die Anzahl der Deskriptoren, die bereit sind.
Die Deskriptormengen werden als Bitfelder in aufsteigender Reihenfolge abgespeichert. Für die Manipulation solcher Deskriptormengen stehen folgende Makros zur Verfügung: FD_ZERO (&fdset)
| initialisiert eine Deskriptormenge fdset mit der Nullmenge. | FD_SET (fd,&fdset)
| fügt einen Deskriptor fd in fdset ein. | FD_CLR (fd,&fdset)
| entfernt fd aus fdset | FD_ISSET (fd,&fdset) | ist ungleich null, wenn fd ein Element aus fdset ist, ansonsten ist es null. |
Das Verhalten dieser Makros ist nicht definiert, falls ein Deskriptorwert kleiner als null oder größer/gleich FD_SETSIZE ist. FD_SETSIZE ist eine Konstante, die in sys/select.h definiert ist, und normalerweise mindestens genauso groß ist wie die maximale Anzahl der Deskriptoren, die vom System zur Verfügung stehen. Falls timeout kein Nullzeiger ist, gibt es eine maximale Zeit an, die gewartet werden soll, bis die Auswahl vollständig ist. Falls timeout ein Nullzeiger ist, blockiert das select bis eines der abgefragten Ereignisse eintritt. select blockiert dann nicht, wenn eine Struktur übergeben wird, die nur Null-Werte enthält. readfds, writefds und execptfds können als Nullzeiger gegeben sein, wenn keine der Deskriptoren von Interesse ist. |
| EINVAL
| Eine Komponente der Zeitgrenze, die referenziert wird, liegt außerhalb des erlaubten Bereichs: t_sec muss zwischen 0 und 100000000, inklusive liegen. t_usec muss größer oder gleich 0 und kleiner oder gleich 1000000 sein. |
Hinweise | Der Standardwert für FD_SETSIZE (augenblicklich 2048) ist gleich der Standardgrenze der Anzahl geöffneter Dateien. Um Programme anzupassen, die eine größere Anzahl geöffneter Dateien mit select verwenden, ist es möglich, diese Größe innerhalb eines Programms zu erhöhen, indem man einen größeren Wert für FD_SETSIZE definiert, bevor man <sys/types.h> einschließt. In zukünftigen Versionen des Systems könnte select die verbliebene Zeit des ursprünglichen Zeitlimits (wenn einer existiert) zurückliefern, indem der Zeitwert an der richtigen Stelle geändert wird. Es ist deshalb nicht ratsam vorauszusetzen, dass der Wert des Zeitlimits durch den select -Aufruf unverändert bleibt. Die Deskriptormengen sind bei der Rückkehr immer verändert, sogar wenn der Aufruf als Ergebnis eines Zeitlimits zurückkehrt. |