.\" -*- coding: UTF-8 -*-
.\" This manpage is copyright (C) 1992 Drew Eckhardt,
.\"     copyright (C) 1995 Michael Shields,
.\"     copyright (C) 2001 Paul Sheer,
.\"     copyright (C) 2006, 2019 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\" Modified 1993-07-24 by Rik Faith <faith@cs.unc.edu>
.\" Modified 1995-05-18 by Jim Van Zandt <jrv@vanzandt.mv.com>
.\" Sun Feb 11 14:07:00 MET 1996  Martin Schulze  <joey@linux.de>
.\"	* layout slightly modified
.\"
.\" Modified Mon Oct 21 23:05:29 EDT 1996 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified Thu Feb 24 01:41:09 CET 2000 by aeb
.\" Modified Thu Feb  9 22:32:09 CET 2001 by bert hubert <ahu@ds9a.nl>, aeb
.\" Modified Mon Nov 11 14:35:00 PST 2002 by Ben Woodard <ben@zork.net>
.\" 2005-03-11, mtk, modified pselect() text (it is now a system
.\"     call in Linux 2.6.16.
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH select 2 "5. Februar 2023" "Linux man\-pages 6.03" 
.SH BEZEICHNUNG
select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO, fd_set \- synchrones
E/A\-Zeitmultiplexverfahren
.SH BIBLIOTHEK
Standard\-C\-Bibliothek (\fIlibc\fP, \fI\-lc\fP)
.SH ÜBERSICHT
.nf
\fB#include <sys/select.h>\fP
.PP
\fBtypedef\fP /* ... */ \fBfd_set;\fP
.PP
\fBint select(int \fP\fInfds\fP\fB, fd_set *_Nullable restrict \fP\fIreadfds\fP\fB,\fP
\fB           fd_set *_Nullable restrict \fP\fIwritefds\fP\fB,\fP
\fB           fd_set *_Nullable restrict \fP\fIexceptfds\fP\fB,\fP
\fB           struct timeval *_Nullable restrict \fP\fItimeout\fP\fB);\fP
.PP
\fBvoid FD_CLR(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
\fBint  FD_ISSET(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
\fBvoid FD_SET(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
\fBvoid FD_ZERO(fd_set *\fP\fIset\fP\fB);\fP
.PP
\fBint pselect(int \fP\fInfds\fP\fB, fd_set *_Nullable restrict \fP\fIreadfds\fP\fB,\fP
\fB           fd_set *_Nullable restrict \fP\fIwritefds\fP\fB,\fP
\fB           fd_set *_Nullable restrict \fP\fIexceptfds\fP\fB,\fP
\fB           const struct timespec *_Nullable restrict \fP\fItimeout\fP\fB,\fP
\fB           const sigset_t *_Nullable restrict \fP\fIsigmask\fP\fB);\fP
.fi
.PP
.RS -4
Mit Glibc erforderliche Feature\-Test\-Makros (siehe
\fBfeature_test_macros\fP(7)):
.RE
.PP
\fBpselect\fP():
.nf
    _POSIX_C_SOURCE >= 200112L
.fi
.SH BESCHREIBUNG
\fBWARNUNG\fP: \fBselect\fP() kann nur Datei\-Deskriptoren\-Nummern überwachen, die
kleiner als \fBFD_SETSIZE\fP (1024) sind. Für viele modernen Anwendungen ist
dies eine unangemessen kleine Begrenzung, aber diese Einschränkung wird sich
nicht ändern. Alle modernen Anwendungen sollten stattdessen \fBpoll\fP(2) oder
\fBepoll\fP(7) verwenden, die dieser Beschränkung nicht unterliegen.
.PP
.\"
Mit der Funktion \fBselect\fP() kann ein Programm mehrere Dateideskriptoren
überwachen und warten, bis ein oder mehrere der Dateideskriptoren »bereit«
für eine Klasse von E/A\-Aktionen sind (z.\ B. Eingabe möglich). Ein
Dateideskriptor gilt als bereit, wenn es möglich ist, eine entsprechende
E/A\-Aktionen (z.B. \fBread\fP (2) oder ein hinreichend kleines \fBwrite\fP(2) ohne
zu blockieren) durchzuführen.
.SS fd_set
.\"
Ein Strukturtyp, der eine Reihe von Dateideskriptoren darstellen kann. Gemäß
POSIX ist die maximale Anzahl an Dateideskriptoren in einer Struktur
\fIfd_set\fP der Wert des Makros \fBFD_SETSIZE\fP.
.SS Dateideskriptor\-Gruppen
Die hauptsächlichen Argumente von \fBselect\fP() sind drei »Gruppen« von
Dateideskriptoren (mit dem Typ \fIfd_set\fP deklariert), die es dem Aufrufenden
erlauben, auf drei Ereignisklassen von der festgelegten Menge an
Dateideskriptoren zu warten. Jedes der \fIfd_set\fP\-Argumente kann als NULL
angegeben werden, falls keine Dateideskriptoren für die entsprechende
Ereignisklasse beobachtet werden soll.
.PP
\fBBeachten Sie gut\fP: Bei der Rückkehr wird jede der Dateideskriptor\-Gruppen
so verändert, dass sie anzeigen, welche Datei\-Deskriptoren derzeit »bereit«
sind. Falls Sie daher \fBselect\fP() innerhalb einer Schleife verwenden,
\fImüssen\fP die Gruppen vor jedem Aufruf \fIneu initialisiert\fP werden.
.PP
Der Inhalt einer Dateideskriptor\-Gruppe kann mit den folgenden Makros
bearbeitet werden:
.TP 
\fBFD_ZERO\fP()
Dieses Makro löscht (entfernt alle Dateideskriptoren aus) \fIset\fP. Es sollte
als erster Schritt beim Initialisieren einer Dateideskriptor\-Gruppe
eingebunden werden.
.TP 
\fBFD_SET\fP()
Dieses Makro fügt den Dateideskriptor \fIfd\fP zu \fIset\fP hinzu. Das Hinzufügen
eines bereits in \fIset\fP vorhandenen Dateideskriptors ist ein Leerbefehl und
löst keinen Fehler aus.
.TP 
\fBFD_CLR\fP()
Dieses Makro entfernt den Dateideskriptor \fIfd\fP aus \fIset\fP. Das Hinzufügen
eines nicht in \fIset\fP vorhandenen Dateideskriptors ist ein Leerbefehl und
löst keinen Fehler aus.
.TP 
\fBFD_ISSET\fP()
.\"
\fBselect\fP() modifiziert den Inhalt der Gruppen entsprechend der nachfolgend
bschriebenen Regeln. Nach dem Aufruf von \fBselect\fP() kann mit dem Makro
\fBFD_ISSET\fP() überprüft werden, ob ein Dateideskriptor noch in einer Gruppe
vorhanden ist. \fBFD_ISSET\fP() gibt einen von 0 verschiedenen Wert zurück,
falls der Dateideskriptor \fIfd\fP in \fIset\fP vorhanden ist; falls nicht, wird 0
zurückgegeben.
.SS Argumente
Die Argumente von \fBselect\fP() im Einzelnen:
.TP 
\fIreadfds\fP
Die Dateideskriptoren in dieser Gruppe werden überwacht, um festzustellen,
ob sie bereit zum Lesen sind. Ein Dateideskriptor ist bereit zum Lesen, wenn
ein Lesevorgang nicht blockiert; insbesondere ist ein Dateideskriptor auch
bereit, wenn das Dateiende erreicht ist.
.IP
Nachdem \fBselect\fP() zurückgekehrt ist, werden alle Dateideskriptoren aus
\fIreadfds\fP entfernt, außer jene, die bereit zum Lesen sind.
.TP 
\fIwritefds\fP
Die Dateideskriptoren in dieser Gruppe werden überwacht, um festzustellen,
ob sie bereit zum Schreiben sind. Ein Dateideskriptor ist bereit zum
Schreiben, wenn ein Schreibvorgang nicht blockiert. Dennoch könnte ein
großer Schreibvorgang noch immer blockieren, selbst wenn ein Dateideskriptor
als schreibbar angezeigt wird.
.IP
Nachdem \fBselect\fP() zurückgekehrt ist, werden alle Dateideskriptoren aus
\fIwritefds\fP entfernt, außer jene, die bereit zum Schreiben sind.
.TP 
\fIexceptfds\fP
Die Dateideskriptoren in dieser Gruppe werden auf »Ausnahmebedingungen«
überwacht. Einige Beispiele für Ausnahmebedingungen finden Sie in den
Erläuterungen zu \fBPOLLPRI\fP in \fBpoll\fP(2).
.IP
Nachdem \fBselect\fP() zurückgekehrt ist, werden alle Dateideskriptoren aus
\fIexceptfds\fP entfernt, außer jene, bei denen Ausnahmebedingungen aufgetreten
sind.
.TP 
\fInfds\fP
Dieses Argument sollte auf die Nummer des am höchsten nummerierten
Dateideskriptors in allen drei Gruppen plus 1 gesetzt werden. Der
gekennzeichnete Dateideskriptor in jeder der drei Gruppen wird bis zu dieser
Begrenzung geprüft (siehe aber FEHLER).
.TP 
\fItimeout\fP
Das Argument \fItimeout\fP ist eine \fItimeval\fP\-Struktur (nachfolgend
beschrieben), welche das Intervall angibt, das \fBselect\fP() warten sollte,
bis ein Dateideskriptor bereit wird. Der Aufruf wird blockieren, bis
entweder:
.RS
.IP \[bu] 3
ein Dateideskriptor bereit wird,
.IP \[bu]
der Aufruf durch einen Signal\-Handler unterbrochen wird, oder
.IP \[bu]
die Wartezeit abläuft.
.RE
.IP
Beachten Sie, das das Intervall \fItimeout\fP auf die Auflösung der Systemuhr
aufgerundet wird. Durch Verzögerungen beim Kernel\-Scheduling kann dieser
Wert nochmals etwas größer werden.
.IP
Falls beide Felder der Struktur \fItimeval\fP gleich 0 sind, kehrt \fBselect\fP()
sofort zurück. (Das ist praktisch für Polling).
.IP
.\"
Falls \fItimeout\fP als NULL angegeben wurde, wird \fBselect\fP() unendlich
warten, bis ein Dateideskriptor bereit wird.
.SS pselect()
Der Systemaufruf \fBpselect\fP() ermöglicht einer Anwendung, sicher zu warten,
bis entweder ein Dateideskriptor bereit wird oder bis ein Signal empfangen
wird.
.PP
Das Verhalten von \fBselect\fP() und \fBpselect\fP() ist bis die folgenden drei
Unterschiede identisch:
.IP \[bu] 3
\fBselect\fP() verwendet für Wartezeiten ein \fIstruct timeval\fP (mit Sekunden
und Mikrosekunden), während \fBpselect\fP() stattdessen ein \fIstruct timespec\fP
(mit Sekunden und Nanosekunden) verwendet.
.IP \[bu]
Während \fBselect\fP() das Argument \fItimeout\fP ändern darf, um die verbleibende
Zeit anzugeben, verändert \fBpselect\fP() dieses Argument nicht.
.IP \[bu]
Die Funktion \fBselect\fP() hat keinen Parameter \fIsigmask\fP und verhält sich
wie \fBpselect\fP, wenn ihr für \fIsigmask\fP ein NULL übergeben wird.
.PP
\fIsigmask\fP ist ein Zeiger auf eine Signalmaske (siehe \fBsigprocmask\fP(2));
falls er ungleich NULL ist, ersetzt \fBpselect\fP() zuerst die aktuelle
Signalmaske durch diejenige, auf die \fIsigmask\fP weist, erledigt danach die
»select«\-Funktion und stellt als Letztes die ursprüngliche Signalmaske
wieder her. (Falls \fIsigmask\fP nicht NULL ist, wird die Signalmaske während
des \fBpselect\fP()\-Aufrufs nicht verändert.)
.PP
Abgesehen von der unterschiedlichen Genauigkeit des \fItimeout\fP\-Arguments ist
der \fBpselect\fP()\-Aufruf
.PP
.in +4n
.EX
ready = pselect(nfds, &readfds, &writefds, &exceptfds,
                timeout, &sigmask);
.EE
.in
.PP
ist äquivalent zur \fIatomaren\fP Ausführung der folgenden Aufrufe:
.PP
.in +4n
.EX
sigset_t origmask;

pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
ready = select(nfds, &readfds, &writefds, &exceptfds, timeout);
pthread_sigmask(SIG_SETMASK, &origmask, NULL);
.EE
.in
.PP
Falls man auf die Verfügbarkeit eines Signals oder eines Dateideskriptors
warten möchte, ist zur Vermeidung von Wettlaufsituationen (race conditions)
eine atomare Prüfung erforderlich, die von \fBpselect\fP() erledigt
wird. (Angenommen, der Signal Handler setzt einen globalen Schalter und
kehrt zurück. Dann könnte eine Prüfung dieses globalen Schalters gefolgt von
einem Aufruf von \fBselect\fP() auf unbestimmte Zeit hängen, wenn das Signal
zwischen der Prüfung und vor dem Aufruf von \fBselect\fP() eintrifft. Im
Gegensatz dazu ermöglicht es \fBpselect\fP() zuerst Signale zu blockieren, die
eingetroffenen Signale abzuarbeiten und anschließend \fBpselect\fP() mit der
gewünschten \fIsigmask\fP aufzurufen, um Race Conditions zu vermeiden.)
.SS "Die Wartezeit (timeout)"
Das Argument \fItimeout\fP für \fBselect\fP() ist eine Struktur des folgenden
Typs:
.PP
.in +4n
.EX
struct timeval {
    time_t      tv_sec;         /* Sekunden */
    suseconds_t tv_usec;        /* Mikrosekunden */
};
.EE
.in
.PP
Das korrespondierende Argument für \fBpselect\fP() ist eine
\fBtimespec\fP(3)\-Struktur.
.PP
.\" .PP - it is rumored that:
.\" On BSD, when a timeout occurs, the file descriptor bits are not changed.
.\" - it is certainly true that:
.\" Linux follows SUSv2 and sets the bit masks to zero upon a timeout.
Unter Linux modifiziert \fBselect\fP() \fItimeout\fP, um die nicht schlafend
verbrachte Zeit anzuzeigen; die meisten anderen Implementierungen tun das
nicht. (POSIX.1 lässt beiderlei Verhalten zu.) Dies führt zu Problemen
sowohl bei der Portierung von Linux\-Code, der \fItimeout\fP liest, auf andere
Betriebssysteme als auch bei der Portierung von Code nach Linux, der eine
\fIstruct timeval\fP in einer Schleife für mehrfache Aufrufe von \fBselect\fP()
nutzt, ohne sie erneut zu initialisieren. Gehen Sie davon aus, dass
\fItimeout\fP nach der Rückkehr aus \fBselect\fP() nicht definiert ist.
.SH RÜCKGABEWERT
Bei Erfolg geben \fBselect\fP() und \fBpselect\fP() die Anzahl der
Datei\-Deskriptoren in den drei zurückgegebenen Deskriptor\-Gruppen
zurück. (Das entspricht der Gesamtzahl von Bits, die in \fIreadfds\fP,
\fIwritefds\fP und \fIexceptfds\fP gesetzt sind.) Der Rückgabewert kann 0 sein,
falls die Wartezeit ablief, bevor der Dateideskriptor bereitstand.
.PP
Bei einem Fehler wird \-1 zurückgegeben und \fIerrno\fP wird gesetzt, um den
Fehler anzuzeigen; die Dateideskriptor\-Gruppen werden nicht verändert und
\fItimeout\fP wird undefiniert.
.SH FEHLER
.TP 
\fBEBADF\fP
In einer der Gruppen wurde ein ungültiger Dateideskriptor
angegeben. (Vielleicht war es ein schon geschlossener Dateideskriptor oder
einer, bei dem ein Fehler aufgetreten ist.) Lesen Sie aber auch FEHLER.
.TP 
\fBEINTR\fP
Ein Signal wurde abgefangen; siehe \fBsignal\fP(7).
.TP 
\fBEINVAL\fP
\fInfds\fP ist negativ oder übersteigt die Ressourcenbegrenzung
\fBRLIMIT_NOFILE\fP (siehe \fBgetrlimit\fP(2)).
.TP 
\fBEINVAL\fP
Der Wert von \fItimeout\fP ist ungültig.
.TP 
\fBENOMEM\fP
Speicher für interne Tabellen konnte nicht bereitgestellt werden.
.SH VERSIONEN
\fBpselect\fP() wurde in Linux\-Version 2.6.16 hinzugefügt. Vorher wurde
\fBpselect\fP() in der Glibc emuliert (siehe aber FEHLER).
.SH STANDARDS
\fBselect\fP() erfüllt POSIX.1\-2001, POSIX.1\-2008 und 4.4BSD (\fBselect\fP()
erschien erstmalig in 4.2BSD). Im Allgemeinen von/nach nicht BSD\-Systeme
portabel, unterstützt Klone der BSD\-Socket\-Schicht (einschließlich
System\-V\-Varianten). Beachten Sie allerdings, dass System\-V\-Varianten
typischerweise die Variable »timeout« vor dem Zurückkehren setzen, die
BSD\-Variante aber nicht.
.PP
\fBpselect\fP() ist in POSIX.1g und in POSIX.1\-2001 und in POSIX.1\-2008
definiert.
.PP
\fBfd_set\fP ist in POSIX.1\-2001 und neuer definiert.
.SH ANMERKUNGEN
Der folgende Header stellt auch den Typ \fIfd_set\fP bereit:
\fI<sys/time.h>\fP.
.PP
Ein \fIfd_set\fP ist ein Puffer fester Größe. Wird \fBFD_CLR\fP() oder \fBFD_SET\fP()
mit einem Wert für \fIfd\fP, der negativ, gleich groß oder größer als
\fBFD_SETSIZE\fP ist, ausgeführt, führt dies zu nicht definiertem
Verhalten. Desweiteren verlangt POSIX, dass \fIfd\fP ein gültiger
Dateideskriptor ist.
.PP
Das Verhalten von \fBselect\fP() und \fBpselect\fP() ist von dem Schalter
\fBO_NONBLOCK\fP nicht betroffen.
.PP
.\" Darwin, according to a report by Jeremy Sequoia, relayed by Josh Triplett
.\"
Unter einigen UNIX\-Systemen kann \fBselect\fP() mit dem Fehler \fBEAGAIN\fP
fehlschlagen, falls es dem System nicht gelingt, Kernel\-interne Ressourcen
zuzuweisen. Linux verwendet hierbei \fBENOMEM\fP. POSIX legt diesen Fehler für
\fBpoll\fP(2) aber nicht für \fBselect\fP() fest. Portable Anwendungen könnten in
einer Schleife auf \fBEAGAIN\fP (wie auch auf \fBEINTR\fP) prüfen.
.SS "Der Selbst\-Pipe\-Trick"
.\"
Auf Systemen, auf denen \fBpselect\fP() fehlt, kann ein zuverlässiges (und
portableres) Abfangen von Signalen mit dem Selbst\-Pipe\-Trick erreicht
werden. Bei dieser Technik schreibt ein Signal\-Handler ein Byte in eine
Pipe, dessen anderes Ende von \fBselect\fP() im Hauptprogramm überwacht
wird. (Um mögliches Blockieren beim Schreiben in eine Pipe, die voll sein
könnte, oder Lesen aus einer Pipe, die leer sein könnte, zu vermeiden, wird
nicht blockierende E/A beim Auslesen und Schreiben in die Pipe verwandt.)
.SS "Emulieren von usleep(3)"
.\"
Vor dem Aufkommen von \fBusleep\fP(3) gab es Code, der \fBselect\fP wie folgt
aufrief: alle drei Deskriptor\-Gruppen leer, \fInfds\fP gleich 0 und ein von
NULL verschiedenes \fItimeout\fP als recht portabler Weg, um mit Auflösungen
unterhalb einer Sekunde zu schlafen.
.SS "Korrespondenz zwischen den Benachrichtigungen select() und poll()"
.\" fs/select.c
Innerhalb der Linux\-Kernelquellen finden wir die folgenden Definitionen, die
die Korrespondenz zwischen den lesbaren, schreibbaren und außerordentlichen
Zustandsbenachrichtigungen von \fBselect\fP() und den durch \fBpoll\fP(2) (und
\fBepoll\fP(7)) bereitgestellten Ereignisbenachrichtigungen zeigt:
.PP
.in +4n
.EX
#define POLLIN_SET  (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN |
                     EPOLLHUP | EPOLLERR)
                   /* Bereit zum Lesen */
#define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM | EPOLLOUT |
                     EPOLLERR)
                   /* Bereit zum Schreiben */
#define POLLEX_SET  (EPOLLPRI)
                   /* Außergewöhnliche Bedingung */
.EE
.in
.\"
.SS "Multithreaded Anwendungen"
.\"
Falls ein Dateideskriptor, der durch \fBselect\fP() überwacht wird, in einem
anderen Thread geschlossen wird, ist das Ergebnis nicht spezifiziert. Auf
einigen UNIX\-Systemen entblockt \fBselect\fP() und kehrt mit einer Information
zurück, dass der Dateideskriptor bereit ist (eine nachfolgende E/A\-Aktion
wird wahrscheinlich mit einem Fehler fehlschlagen, außer ein anderer Prozess
hat den Dateideskriptor zwischen dem Zeitpunkt, zu dem \fBselect\fP()
zurückkehrte, und dem Zeitpunkt, zu der die E/A\-Aktion stattfindet, wieder
geöffnet). Unter Linux (und einigen anderen Systemen) hat das Schließen des
Dateideskriptors in einem anderen Thread keinen Effekt auf
\fBselect\fP(). Zusammenfassend sollte jede Anwendung, die sich auf ein
bestimmtes Verhalten in diesem Szenario abstützt, als fehlerhaft betrachtet
werden.
.SS "Unterschiede C\-Bibliothek/Kernel"
Der Linux\-Kernel erlaubt Dateideskriptor\-Gruppen beliebiger Größe und
bestimmt die Größe der zu prüfenden Gruppen durch den Wert von \fInfds\fP. In
der Glibc\-Implementierung ist der Typ \fIfd_set\fP allerdings von fester
Größe. Siehe auch FEHLER.
.PP
Die in dieser Seite beschriebene Schnittstelle von \fBpselect\fP() wird durch
Glibc implementiert. Der darunterliegende Systemaufruf heißt
\fBpselect6\fP(). Dieser Systemaufruf hat ein etwas anderes Verhalten als die
Glibc\-Wrapper\-Funktion.
.PP
Der Systemaufruf \fBpselect6\fP() von Linux verändert das Argument
\fItimeout\fP. Die Glibc\-Wrapper\-Funktion versteckt dieses Verhalten durch
Verwendung einer lokalen Variablen für das Argument »timeout«, die an den
Systemaufruf übergeben wird. Daher verändert die Glibc\-Funktion \fBpselect\fP()
nicht ihr Argument \fItimeout\fP; dies ist das von POSIX.1\-2001 verlangte
Verhalten.
.PP
Das finale Argument des Systemaufrufs \fBpselect6\fP() ist kein \fIsigset_t\ *\fP\-Zeiger, sondern eine Struktur der folgenden Form:
.PP
.in +4n
.EX
struct {
    const kernel_sigset_t *ss;  /* Zeiger auf Signalgruppe */
    size_t ss_len;              /* Größe (in Bytes) des Objekts,
                                   auf das durch »ss« gezeigt wird */
};
.EE
.in
.PP
.\"
Dies erlaubt es dem Systemaufruf, sowohl einen Zeiger auf die Signalgruppe
als auch seine Größe zu ermitteln und dabei zu berücksichtigen, dass die
meisten Architekturen eine maximale Anzahl von 6 Argumenten für einen
Systemaufruf erlauben. Siehe \fBsigprocmask\fP(2) für eine Diskussion der
Unterschiede zwischen der Ansicht des Kernels und der Ansicht der Libc
bezüglich der Singalmenge.
.SS "Geschichtliche Glibc\-Details"
Glibc 2.0 stellte eine inkorrekte Version von \fBpselect\fP() bereit, die das
Argument \fIsigmask\fP nicht akzeptierte.
.PP
In den Glibc\-Versionen von 2.1 bis 2.2.1 musste \fB_GNU_SOURCE\fP definiert
werden, um die Deklaration von \fBpselect\fP() aus \fI<sys/select.h>\fP zu
erhalten.
.SH FEHLER
POSIX erlaubt einer Implementierung, eine oberer Begrenzung für den Bereich
von Dateideskriptoren, die in einer Dateideskriptor\-Gruppe festgelegt werden
können, zu definieren. Diese Begrenzung soll mittels der Konstanten
\fBFD_SETSIZE\fP bekannt gemacht werden. Der Linux\-Kernel erzwingt keine feste
Begrenzung, aber die Glibc\-Implementierung macht \fIfd_set\fP zu einem Typ
fester Größe, wobei \fBFD_SETSIZE\fP als 1024 definiert ist und die Makros
\fBFD_*\fP() arbeiten entsprechend dieser Begrenzung. Um Dateideskriptoren
größer als 1024 zu überwachen, verwenden Sie stattdessen \fBpoll\fP(2) oder
\fBepoll\fP(7).
.PP
Die Implementierung der Argumente \fIfd_set\fP als Wert\-Ergebnis\-Argumente ist
ein Design\-Fehler, der in \fBpoll\fP(2) und \fBepoll\fP(7) vermieden wurde.
.PP
Laut POSIX sollte \fBselect\fP() alle festgelegten Dateideskriptoren in den
drei Dateideskriptor\-Gruppen bis zur Grenze \fInfds\-1\fP prüfen. Allerdings
ignoriert die aktuelle Implementierung jeden Dateideskriptor in diesen
Gruppen, der größer als die maximale Dateideskriptorennummer ist, die der
Prozess derzeit offen hat. Laut POSIX sollte jeder solcher
Dateideskriptoren, der in einer der drei Gruppen festgelegt ist, zu einem
Fehler \fBEBADF\fP führen.
.PP
Beginnend mit Version 2.1 stellt Glibc eine Emulation von \fBpselect\fP()
bereit, die mittels \fBsigprocmask\fP(2) und \fBselect\fP() implementiert
wurde. Diese Implementierung blieb für den starken Ressourcenwettlauf
verwundbar, der durch das Design von \fBpselect\fP() vermieden werden
sollte. Moderne Versionen der Glibc verwenden den (ressourcenwettlauffreien)
\fBpselect\fP()\-Systemaufruf auf Kerneln, die ihn bereitstellen.
.PP
.\" Stevens discusses a case where accept can block after select
.\" returns successfully because of an intervening RST from the client.
.\" Maybe the kernel should have returned EIO in such a situation?
Unter Linux könnte \fBselect\fP() einen Socket\-Dateideskriptor als »bereit zum
Lesen« melden, obwohl trotzdem ein folgendes Lesen blockiert. Dies könnte
beispielsweise passieren, wenn Daten angekommen sind, aber bei genauerer
Prüfung die falsche Prüfsumme haben und daher verworfen werden. Es mag
andere Umstände geben, in denen ein Dateideskriptor fälschlicherweise als
bereit berichtet werden könnte. Daher mag es sicherer sein, \fBO_NONBLOCK\fP
bei Sockets zu benutzen, die nicht blockieren sollen.
.PP
Unter Linux verändert \fBselect\fP() auch \fItimeout\fP falls der Aufruf durch ein
Signal\-Handler unterbrochen wird (d.h. den Fehler \fBEINTR\fP
zurückliefert). Dies wird von POSIX.1 nicht erlaubt. Der Linux\-Systemaufruf
\fBpselect\fP() zeigt das gleiche Verhalten, aber der Glibc\-Wrapper versteckt
das Verhalten, indem er intern \fItimeout\fP in eine lokale Variable kopiert
und diese Variable an den Systemaufruf übergibt.
.SH BEISPIELE
.\" SRC BEGIN (select.c)
.EX
#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>

int
main(void)
{
    int             retval;
    fd_set          rfds;
    struct timeval  tv;

    /* Beobachte stdin (fd 0), um zu sehen, wenn es Eingaben gibt. */

    FD_ZERO(&rfds);
    FD_SET(0, &rfds);

    /* Warte bis zu fünf Sekunden. */

    tv.tv_sec = 5;
    tv.tv_usec = 0;

    retval = select(1, &rfds, NULL, NULL, &tv);
    /* Verlassen Sie sich jetzt nicht auf den Wert von tv! */

    if (retval == \-1)
        perror("select()");
    else if (retval)
        printf("Daten sind jetzt verfügbar.\en");
        /* FD_ISSET(0, &rfds) werden wahr sein. */
    else
        printf("Innerhalb von fünf Sekunden keine Daten.\en");

    exit(EXIT_SUCCESS);
}
.EE
.\" SRC END
.SH "SIEHE AUCH"
\fBaccept\fP(2), \fBconnect\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBrecv\fP(2),
\fBrestart_syscall\fP(2), \fBsend\fP(2), \fBsigprocmask\fP(2), \fBwrite\fP(2),
\fBtimespec\fP(3), \fBepoll\fP(7), \fBtime\fP(7)
.PP
Für eine Anleitung mit Diskussionen und Beispielen lesen Sie
\fBselect_tut\fP(2).
.PP
.SH ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von
Martin Schulze <joey@infodrom.org>,
Daniel Kobras <kobras@linux.de>,
Martin Eberhard Schauer <Martin.E.Schauer@gmx.de>,
Mario Blättermann <mario.blaettermann@gmail.com>
und
Helge Kreutzmann <debian@helgefjell.de>
erstellt.
.PP
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License Version 3
.UE
oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
.PP
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden,
schicken Sie bitte eine E-Mail an die
.MT debian-l10n-german@lists.debian.org
Mailingliste der Übersetzer
.ME .