.\" -*- 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 .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified 1993-07-24 by Rik Faith .\" Modified 1995-05-18 by Jim Van Zandt .\" Sun Feb 11 14:07:00 MET 1996 Martin Schulze .\" * layout slightly modified .\" .\" Modified Mon Oct 21 23:05:29 EDT 1996 by Eric S. Raymond .\" Modified Thu Feb 24 01:41:09 CET 2000 by aeb .\" Modified Thu Feb 9 22:32:09 CET 2001 by bert hubert , aeb .\" Modified Mon Nov 11 14:35:00 PST 2002 by Ben Woodard .\" 2005-03-11, mtk, modified pselect() text (it is now a system .\" call in 2.6.16. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH SELECT 2 "1. November 2020" Linux Linux\-Programmierhandbuch .SH BEZEICHNUNG select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \- synchrones E/A\-Zeitmultiplexverfahren .SH ÜBERSICHT .nf \fB#include \fP .PP \fBint select(int \fP\fInfds\fP\fB, fd_set *\fP\fIreadfds\fP\fB, fd_set *\fP\fIwritefds\fP\fB,\fP \fB fd_set *\fP\fIexceptfds\fP\fB, struct timeval *\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 *\fP\fIreadfds\fP\fB, fd_set *\fP\fIwritefds\fP\fB,\fP \fB fd_set *\fP\fIexceptfds\fP\fB, const struct timespec *\fP\fItimeout\fP\fB,\fP \fB const sigset_t *\fP\fIsigmask\fP\fB);\fP .fi .PP .RS -4 Mit Glibc erforderliche Makros (siehe \fBfeature_test_macros\fP(7)): .RE .PP \fBpselect\fP(): _POSIX_C_SOURCE\ >=\ 200112L .SH BESCHREIBUNG 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. .PP .\" \fBselect\fP() kann nur Dateideskriptorennummern überwachen, die kleiner als \fBFD_SETSIZE\fP sind; \fBpoll\fP(2) und \fBepoll\fP(7) haben diese Einschränkung nicht. Siehe FEHLER. .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 \fBWohlgemerkt\fP: Wenn die Funktion zurückkehrt, wird jede der Datei\-Deskriptorenmengen so verändert, dass sie anzeigen, welcher Dateideskriptor derzeit »bereit« ist. Falls Sie daher \fBselect\fP() innerhalb einer Schleife verwenden, \fImüssen\fP die Mengen vor jedem Aufruf \fIneu initialisiert\fP werden. Die Implementierung des Arguments \fIfd_set\fP als Wert\-Ergebnis\-Argument ist ein Design\-Fehler, der in \fBpoll\fP(2) und \fBepoll\fP(7) vermieden wurde. .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 2 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 2 \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\-Zeiger ü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() hat den folgenden Typ: .PP .in +4n .EX struct timespec { time_t tv_sec; /* Sekunden */ long tv_nsec; /* Nanosekunden */ }; .EE .in .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 im Linux\-Kernel 2.6.16 hinzugefügt. Vorher wurde \fBpselect\fP() in der Glibc emuliert (siehe aber FEHLER). .SH "KONFORM ZU" \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. .SH ANMERKUNGEN 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\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 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 .EX #include #include #include int main(void) { fd_set rfds; struct timeval tv; int retval; /* 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 .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), \fBepoll\fP(7), \fBtime\fP(7) .PP Für eine Anleitung mit Diskussionen und Beispielen lesen Sie \fBselect_tut\fP(2). .SH KOLOPHON Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux\-\fIman\-pages\fP. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter \%https://www.kernel.org/doc/man\-pages/. .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze , Daniel Kobras , Martin Eberhard Schauer , Mario Blättermann und Helge Kreutzmann erstellt. 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. 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 .