select(3C) select(3C)
NAME
select, FDCLR, FDISSET, FDSET, FDZERO - Synchrones E/A-Multiplexen
SYNTAX
#include <sys/time.h>
#include <sys/types.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *errorfds, 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
Die Funktion select() gibt an, welche der angegebenen Dateideskripto-
ren bereit für Lesen oder für Schreiben sind, oder für welche eine
Fehlerbedingung ansteht. Wenn die angegebene Bedingung auf keinen der
angegebenen Dateideskriptoren zutrifft, wird select() für die Dauer
eines definierten Zeitintervalls blockiert, bis die Bedingung zumin-
dest für einen der angegebenen Dateideskriptoren zutrifft.
Die Funktion select() unterstützt reguläre Dateien, Gerätedateien für
Terminals und Pseudo-Terminals (pty), STREAMS-Dateien, FIFOs und
Pipes. Das Verhalten von select() bei Dateideskriptoren, die auf
andere Dateitypen verweisen, ist nicht definiert.
Das Argument nfds gibt den Bereich der zu überprüfenden Dateideskrip-
toren an. Die Funktion select() überprüft Dateideskriptoren im Bereich
von 0 bis nfds-1.
Ist das Argument readfs kein Null-Zeiger, zeigt es auf ein Objekt des
Typs fdset, das bei Eingabe die auf Lesebereitschaft zu überprüfenden
Dateideskriptoren und bei Ausgabe die Dateideskriptoren angibt, die
lesebereit sind.
Ist das Argument writefs kein Null-Zeiger, zeigt es auf ein Objekt des
Typs fdset, das bei Eingabe die auf Schreibbereitschaft zu überprü-
fenden Dateideskriptoren und bei Ausgabe die Dateideskriptoren angibt,
die schreibbereit sind.
Ist das Argument errorfds kein Null-Zeiger, zeigt es auf ein Objekt
des Typs fdset, das bei Eingabe die auf anstehende Fehlerbedingungen
zu überprüfenden Dateideskriptoren und bei Ausgabe die Dateideskripto-
ren angibt, für die Fehlerbedingungen anstehen.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
select(3C) select(3C)
Bei erfolgreicher Ausführung werden die Objekte, auf die die Argumente
readfs, writefs und errorfds zeigen, so geändert, daß angezeigt wird,
welche Dateideskriptoren bereit für Lesen oder bereit für Schreiben
sind, bzw. für welche eine Fehlerbedingung ansteht. Für jeden Dateide-
skriptor kleiner als nfds wird das zugehörige Bit bei erfolgreicher
Ausführung gesetzt, wenn es auch bei der Eingabe gesetzt wurde und die
zugeordnete Bedingung für diesen Dateideskriptor zutrifft.
Ist das Argument timeout kein Null-Zeiger, zeigt es auf ein Objekt des
Typs struct timeval, das ein Zeitlimit für die Ausführung der Auswahl
angibt. Wenn das Argument timeout auf ein Objekt des Typs struct
timeval zeigt, dessen Komponenten 0 sind, wird select() nicht blok-
kiert. Ist das Argument timeout ein Null-Zeiger, wird select() blok-
kiert, bis ein Ereignis eintrifft, aufgrund dessen eine der Masken mit
einem gültigen Wert (ungleich Null) zurückgegeben wird. Wenn das Zeit-
limit vor Eintreffen eines Ereignisses, bei dem eine der Masken auf
einen Wert ungleich Null gesetzt wird, abläuft, wird die Funktion
select() erfolgreich beendet und gibt den Wert 0 zurück.
Abhängig von der jeweiligen Implementierung kann das maximal unter-
stützte Zeitlimit eingeschränkt sein. Bei allen Implementierungen
beträgt das unterstützte Zeitlimit mindestens 31 Tage. Gibt das Argu-
ment timeout ein Zeitlimit über dem implementierungsabhängigen Maxi-
malwert an, wird der Maximalwert als Zeitlimit verwendet. Durch die
jeweilige Implementierung kann auch die Granularität von Zeitinterval-
len eingeschränkt sein. Ist für das angeforderte Zeitlimit eine höhere
Granularität als die durch die Implementierung unterstützte erforder-
lich, wird das tatsächliche Zeitlimit auf den jeweils nächsten, unter-
stützten Wert gerundet.
Sind die Argumente readfs, writefs und errorfds Null-Zeiger und ist
das Argument timeout kein Null-Zeiger, wird select() bis zum Ablauf
des angegebenen Zeitlimits bzw. bis zur Unterbrechung durch ein Signal
blockiert. Sind die Argumente readfs, writefs und errorfds Null-Zeiger
und ist das Argument timeout ebenfalls ein Null-Zeiger, wird select()
bis zur Unterbrechung durch ein Siganl blockiert.
Dateideskriptoren, die regulären Dateien zugeordnet sind, nehmen für
Lesebereitschaft, Schreibbereitschaft und anstehenden Fehlerbedingun-
gen immer den Wert wahr (true) an.
Bei einem Fehler werden die Objekte, auf die die Argumente readfs,
writefs und errorfds zeigen, nicht geändert. Wenn das Zeitlimit
abläuft, ohne daß die entsprechende Bedingung für eine der angegebenen
Dateideskriptoren vorliegt, werden alle Bits der Objekte, auf die die
Argumente readfs, writefs und errorfds zeigen, auf 0 gesetzt.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
select(3C) select(3C)
Dateideskriptormasken des Typs fdset können initialisiert werden. Es
ist nicht definiert, ob es sich hier jeweils um ein Makro oder eine
Funktion handelt. Wird eine Makrodefinition unterdrückt, um den
Zugriff auf eine echte Funktion zu erhalten, oder definiert ein Pro-
gramm eine externe Kennung mit einem dieser Namen, ist das Verhalten
nicht definiert.
FDCLR(fd, &fdset)
Löscht das Bit für den Dateideskriptor fd in der Dateideskriptor-
gruppe fdset.
FDISSET(fd, &fdset)
Gibt einen Wert ungleich Null zurück, wenn das Bit für den Datei-
deskriptor fd in der Dateideskriptorgruppe gesetzt ist, auf die
fdset zeigt. Andernfalls wird 0 zurückgegeben.
FDSET(fd, &fdset)
Setzt das Bit für den Dateideskriptor fd in der Dateideskriptor-
gruppe fdset.
FDZERO(&fdset)
Initialisiert die Dateideskriptorgruppe fdset, so daß für alle
Dateideskriptoren Null-Bits gelten.
Das Verhalten dieser Makros ist nicht definiert, wenn das Argument fd
kleiner als 0 oder größer oder gleich FDSETSIZE ist.
RÜCKGABEWERT
fd wird in der Dateideskriptorgruppe gesetzt, auf die fdset zeigt,
andernfalls wird 0 angegeben.
Bei erfolgreicher Ausführung gibt select() die Gesamtanzahl der Bits
zurück, die in den Bit-Masken gesetzt sind. Andernfalls wird -1
zurückgegeben und errno wird gesetzt, um den Fehler anzuzeigen.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
Bei folgenden Bedingungen schlägt select() fehl und setzt errno auf
den angegebenen Wert:
EBADF In einer oder mehreren Dateideskriptorgruppen ist ein ungül-
tiger Dateideskriptor angegeben.
EINTR Die Funktion select() wurde vor Eintreffen eines der ausge-
wählten Ereignisse und vor Ablauf des Zeitlimits unterbro-
chen.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
select(3C) select(3C)
Wurde SARESTART für das Unterbrechungssignal gesetzt, hängt es von
der jeweiligen Implementierung ab, ob select() neu gestartet oder
EINTR zurückgegeben wird.
EINVAL Ein ungültiges Zeitlimit wurde angegeben.
EINVAL Das Argument nfds ist kleiner als 0 oder größer oder gleich
FDSETSIZE.
EINVAL Einer der angegebenen Dateideskriptoren verweist auf einen
STREAM oder Multiplexer mit einem (direkten oder indirekten)
Link unterhalb eines Multiplexers.
ANWENDUNGSZWECK
Die Verwendung eines Zeitlimits hat keine Auswirkungen auf eventuelle
Zeitgeber, die durch alarm(), ualarm() oder settimer() eingerichtet
wurden.
Bei erfolgreicher Ausführung wird das Objekt, auf das das Argument
timeout zeigt, möglicherweise geändert.
SIEHE AUCH
fcntl(2), poll(2), read(2), write(2), systime(5), types(5).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98