*nix auswählen und exceptfds/errorfds Semantik
Den wählen Sie syscall dauert 3 filedescriptors-sets für die Beobachtung von fds für die lesbar/schreibbar, und "Ausnahmen" auf filedescriptors.
Meine wählen Sie Mann Seite nicht viel über die exceptfd
- Deskriptor festgelegt. Für was wird es verwendet; welche Art von Ausnahmen kann und wird es Benachrichtigen Sie auf Datei-Deskriptoren?
Ich nehme an, dass diese Verschieden sein können für den Deskriptor-Typ,... ob es einen TCP-socket, eine pipe, ein tty , etc.). Hat jemand mehr info darüber, welche Art von Fehler select
können Bericht über die verschiedenen Arten von Deskriptoren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es manchmal gedacht, dass exceptfds nötig ist, Fehler zu erkennen, aber das ist ein Irrglaube. Fehler werden gekennzeichnet in readfds. Obwohl POSIX erfordert (und nennt sogar die parameter errorfds), es kommt auf das OS an, ob Fehler sind auch gekennzeichnet in exceptfds. Wirklich, dieser parameter wird nur dann benötigt, wenn Sie sich über außergewöhnlichen Bedingungen, aber nur selten ist es nötig zu erkennen, diese.
Was qualifiziert als eine außergewöhnliche Bedingung hängt von der Art der Datei-Deskriptor, aber bei weitem die häufigste Verwendung ist auf einen TCP-socket, wo es zeigt, dass out-of-band-Daten werden gelesen mit
recv()
mit derMSG_OOB
Flagge. Jedoch TCP-out-of-band-Daten hat eine Reihe von Macken (z.B. nur 1 byte ausstehen können) und als Ergebnis wird nur selten verwendet.In den letzten Linux-Kerneln exceptfds kann verwendet werden, um zu erkennen, Wann bestimmte sysfs-Attribute ändern. Der aktuelle Wert des Attributs gelesen werden können, durch das Lesen der entsprechenden Datei unter
/sys
, und einselect()
auf der file-Deskriptor wird flag exceptfds, wenn das Attribut ändert. Doch das funktioniert bisher nur für einige der Attribute, und für Berg-änderungen (/proc/mounts
).Auch einige Gerätetreiber Flagge bestimmte gerätespezifische Bedingungen mit exceptfds.
Du hast Recht, es kommt auf die Art von Gerät Sie verweisen mit den Datei-Deskriptoren. Also, es ist unterschiedlich für sockets, FIFOs, serielle ports, etc...
Blick auf die man-Seite Lesen(). An der Unterseite (zumindest unter OS X) es wird eine Liste der verschiedenen Fehler, die Sie bekommen können für verschiedene Geräte. Gleiches gilt für write().
Für sockets, FIFOs und anderen IPC-Mechanismen, würde ich check out Unix Network Programming, Band 1 und 2. IIRC es beschreibt, welche Art von errnos zu erwarten, dass für verschiedene Fehlerzustände.
Ich ging diesen Weg einmal mit FIFOs. Ich landete brainstorming alle Möglichkeiten, die Produzenten und Konsumenten interagieren können, mit jedem Ende der FIFO und dann schrieb Testfälle für jede dieser Situationen. Es war ein gut (obwohl langweilig) Weg zu entdecken, all die verschiedenen Fehlerbedingungen. Ich habe viel gelernt, obwohl letztendlich der code funktioniert jetzt.