.\" -*- coding: UTF-8 -*- .\" This manpage is copyright (C) 1992 Drew Eckhardt, .\" copyright (C) 1995 Michael Shields. .\" .\" %%%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 "15. September 2017" Linux Linux\-Programmierhandbuch .SH BEZEICHNUNG select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \- synchrones E/A\-Zeitmultiplexverfahren .SH ÜBERSICHT .nf /* laut POSIX.1\-2001, POSIX.1\-2008 */ \fB#include \fP .PP /* Laut älterer Standards */ \fB#include \fP \fB#include \fP \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 \fB#include \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 .in -4n Mit Glibc erforderliche Makros (siehe \fBfeature_test_macros\fP(7)): .in .PP \fBpselect\fP(): _POSIX_C_SOURCE\ >=\ 200112L .SH BESCHREIBUNG Mit den Funktionen \fBselect\fP() und \fBpselect\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) ohne zu blockieren oder ein hinreichend kleines \fBwrite\fP(2)) durchzuführen. .PP \fBselect\fP() kann nur Dateideskriptorennummern überwachen, die kleiner als \fBFD_SETSIZE\fP sind; \fBpoll\fP(2) hat diese Einschränkung nicht. Siehe FEHLER. .PP Das Verhalten von \fBselect\fP() und \fBpselect\fP() ist bis die folgenden drei Unterschiede identisch: .TP (i) \fBselect\fP() verwendet für Zeitbegrenzungen (timeouts) eine \fIstruct timeval\fP (mit Sekunden und Mikrosekunden), während \fBpselect\fP() stattdessen eine \fIstruct timespec\fP (mit Sekunden und Nanosekunden) verwendet. .TP (ii) Während \fBselect\fP() das Argument \fItimeout\fP ändern darf, um die verbleibende Zeit anzugeben, verändert \fBpselect\fP() dieses Argument nicht. .TP (iii) 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 Es werden drei voneinander unabhängige Mengen von Deskriptoren überwacht. Die in \fIreadfds\fP aufgeführten Deskriptoren werden daraufhin beobachtet, ob neue Zeichen zum Lesen ankommen (genauer: ob eine Leseaktion nicht blockiert; insbesondere ist ein Dateideskriptor auch am Dateiende (EOF) bereit). Die Datei\-Deskriptoren in \fIwritefds\fP werden daraufhin beobachtet, ob Platz zum Schreiben verfügbar ist (ein größerer Schreibaufruf kann aber dennoch blockieren) und die Datei\-Deskriptoren in \fIexceptfds\fP werden auf außergewöhnliche Bedingungen überwacht. (Lesen Sie die Diskussion von \fBPOLLPRI\fP in \fBpoll\fP(2) für Beispiele für außergewöhnliche Bedingungen.) .PP Wenn die Funktion beendet wird, wird jede der Datei\-Deskriptorenmengen so verändert, dass sie anzeigen, welcher Deskriptor seinen Status geändert hat. (Falls Sie daher \fBselect\fP() innerhalb einer Schleife verwenden, müssen die Mengen vor jedem Aufruf neu initialisiert werden.) .PP Jeder der drei Mengen von Deskriptoren kann als NULL angegeben werden, falls für die entsprechenden Dateideskriptoren keine Klassen oder Ereignisse überwacht werden müssen. .PP Es werden vier Makros bereitgestellt, um mit diesen Mengen zu arbeiten. \fBFD_ZERO\fP() löscht eine Menge, \fBFD_SET\fP() fügt einen Deskriptor zu einer Menge hinzu und \fBFD_CLR\fP() löscht diesen. \fBFD_ISSET\fP() prüft, ob der Deskriptor in der Menge enthalten ist. Das ist insbesondere nach einem Aufruf von \fBselect\fP() nützlich. .PP \fInfds\fP sollte auf die Nummer des am höchsten nummerierten Dateideskriptors in allen drei Mengen plus 1 gesetzt werden. Der gekennzeichnete Dateideskriptor in jeder der drei Mengen wird bis zu dieser Begrenzung geprüft (siehe aber FEHLER). .PP Das Argument \fItimeout\fP legt das Intervall fest, das \fBselect\fP() warten sollte, bis ein Dateideskriptor bereit wird. Der Aufruf wird blockieren, bis entweder: .IP * 3 ein Dateideskriptor bereit wird, .IP * der Aufruf durch einen Signal\-Handler unterbrochen wird, oder .IP * die Wartezeit (timeout) abläuft. .PP 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. Falls beide Felder der Struktur \fItimeval\fP gleich null sind, kehrt \fBselect\fP() sofort zurück. (Das ist praktisch für Polling). Falls \fItimeout\fP gleich NULL ist (kein timeout), kann \fBselect\fP() auf unbestimmte Zeit blockieren. .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 mit derjenigen, auf die \fIsigmask\fP weist, erledigt danach die »select«\-Funktion und stellt als Letztes die ursprüngliche Signalmaske wieder her. .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 äquivalent zur \fIatomaren\fP (unterbrechungsfreien, aufeinanderfolgenden) 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 .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)" Die Zeitstrukturen sind in \fI\fP als .PP .in +4n .EX struct timeval { long tv_sec; /* Sekunden */ long tv_usec; /* Mikrosekunden */ }; .EE .in .PP und .PP .in +4n .EX struct timespec { long tv_sec; /* Sekunden */ long tv_nsec; /* Nanosekunden */ }; .EE .in .PP definiert. (Sehen Sie sich aber weiter unten die Besonderheiten der POSIX.1\-Versionen an.) .PP Es gibt Code, der \fBselect\fP wie folgt aufruft: alle drei Deskriptor\-Mengen leer, \fInfds\fP gleich null und ein von NULL verschiedenes \fItimeout\fP als recht portabler Weg, um mit Auflösungen unterhalb einer Sekunde zu schlafen. .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\-Mengen zurück. (Das entspricht der Gesamtzahl von Bits, die in \fIreadfds\fP, \fIwritefds\fP und \fIexceptfds\fP gesetzt sind.) Der Wert kann null sein, falls die Wartezeit abläuft, ohne das irgendetwas von Bedeutung geschieht. Wenn ein Fehler auftritt, wird \-1 zurückgegeben und \fIerrno\fP gesetzt, um den Fehler anzugeben. Die Datei\-Deskriptor\-Mengen bleiben unverändert und \fItimeout\fP wird undefiniert. .SH FEHLER .TP \fBEBADF\fP In einem der Mengen 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 Beenden 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 .\" 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. .PP 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.) .PP Im Hinblick auf die beteiligten Typen ist die klassische Situation, dass zwei Felder einer Struktur \fItimeval\fP vom Typ \fIlong\fP (wie gezeigt) sind und die Struktur in \fI\fP definiert ist. Die POSIX.1\-Situation ist .PP .in +4n .EX struct timeval { time_t tv_sec; /* Sekunden */ suseconds_t tv_usec; /* Mikrosekunden */ }; .EE .in .PP wobei die Struktur in \fI\fP definiert und die Datentypen \fItime_t\fP und \fIsuseconds_t\fP in \fI\fP definiert sind. .PP Im Hinblick auf Prototypen ist die klassische Situation, dass \fI\fP für \fBselect\fP() eingebunden werden sollte. Die Situation unter POSIX.1 ist, dass \fI\fP für \fBselect\fP() und \fBpselect\fP() eingebunden werden sollte. .PP .\" Unter Glibc 2.0 gibt \fI\fP den falschen Prototyp für \fBpselect\fP(). Unter Glibc 2.1 bis 2.2.1 gibt er \fBpselect\fP(), wenn \fB_GNU_SOURCE\fP definiert ist. Seit Glibc 2.2.2 gelten die in ÜBERSICHT gezeigten Anforderungen. .SS "Korrespondenz zwischen den Benachrichtigungen select() und poll()" .\" fs/select.c Innerhalb der Linux\-Kernelquellen finden wir die folgende Definition, 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 (POLLRDNORM | POLLRDBAND | POLLIN | POLLHUP | POLLERR) /* Bereit zum Lesen */ #define POLLOUT_SET (POLLWRBAND | POLLWRNORM | POLLOUT | POLLERR) /* Bereit zum Schreiben */ #define POLLEX_SET (POLLPRI) /* 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 jemand anders hat den Dateideskriptor zwischen dem Zeitpunkt, zu dem \fBselect\fP() zurückkehrte, und dem Zeitpunkt, zu der die E/A\-Aktion stattfand, 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 Dateideskriptormengen beliebiger Größe und bestimmt die Größe der zu prüfenden Mengen 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 Arguemnt »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 +4 .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. .SH FEHLER POSIX erlaubt einer Implementierung, eine oberer Begrenzung für den Bereich von Dateideskriptoren, die in einer Dateideskriptorenmenge 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). .PP Laut POSIX sollte \fBselect\fP() alle festgelegten Dateideskriptoren in den drei Dateideskriptorenmengen bis zur Grenze \fInfds\-1\fP prüfen. Allerdings ignoriert die aktuelle Implementierung jeden Dateideskriptor in diesen Mengen, der größer als die maximale Dateideskriptorennummer ist, die der Prozess derzeit offen hat. Laut POSIX sollte jeder solcher Dateideskriptoren, der in einem der drei Mengen festgelegt ist, zu einem Fehler \fBEBADF\fP führen. .PP Glibc 2.0 stellte eine Version von \fBpselect\fP() bereit, die das Argument \fIsigmask\fP nicht akzeptierte. .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 BEISPIEL .EX #include #include #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 4.16 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 GNU General Public License Version 3 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 .