* nix select und exceptfds/errorfds-Semantik

Lesezeit: 3 Minuten

Benutzeravatar von leeeroy
leeroy

Das auswählen syscall benötigt 3 Dateideskriptorsätze zum Überwachen von fds auf Lesbarkeit/Schreibbarkeit und “Ausnahmen” für Dateideskriptoren.

Meine Auswahl Manpage sagt nicht viel über die aus exceptfd Beschreibungssatz. Was wird es verwendet; Welche Art von Ausnahmen kann und wird es bei Dateideskriptoren melden?

Ich gehe davon aus, dass dies für den Deskriptortyp unterschiedlich sein kann … ob es sich um einen TCP-Socket, eine Pipe, ein tty usw. handelt). Hat jemand nähere Infos was für Fehler select können über die verschiedenen Arten von Deskriptoren berichten?

Das wird manchmal gedacht außerfds wird benötigt, um Fehler zu erkennen, aber das ist ein Irrglaube. Fehler werden eingeblendet lesen. Obwohl POSIX dies erfordert (und sogar den Parameter aufruft errorfds), hängt es vom Betriebssystem ab, ob auch Fehler mitgemeldet werden außerfds. Wirklich, dieser Parameter wird nur benötigt, wenn Sie sich darum kümmern außergewöhnliche Bedingungenaber nur selten besteht die Notwendigkeit, diese zu erkennen.

Was als Ausnahmezustand qualifiziert wird, hängt von der Art des Dateideskriptors ab, aber die bei weitem häufigste Verwendung ist ein TCP-Socket, wo es anzeigt, dass Out-of-Band-Daten zum Lesen verfügbar sind recv() mit dem MSG_OOB Flagge. TCP-Out-of-Band-Daten haben jedoch eine Reihe von Macken (z. B. kann nur 1 Byte ausstehend sein) und werden daher selten verwendet.

In neueren Linux-Kernels außerfds kann verwendet werden, um zu erkennen, wenn sich bestimmte sysfs-Attribute ändern. Der aktuelle Wert des Attributs kann durch Lesen der entsprechenden Datei unter gelesen werden /sysund ein select() auf dem Dateideskriptor wird gekennzeichnet außerfds wenn sich das Attribut ändert. Dies funktioniert derzeit jedoch nur für einige der Attribute und für Mount-Änderungen (/proc/mounts).

Außerdem kennzeichnen einige Gerätetreiber bestimmte gerätespezifische Bedingungen mit außerfds.

Sie haben Recht, es hängt von der Art des Geräts ab, auf das Sie mit den Dateideskriptoren verweisen. Bei Sockets, FIFOs, seriellen Ports usw. ist es also anders.

Sehen Sie sich die Manpage für read() an. Unten (zumindest in OS X) werden die verschiedenen Fehler aufgeführt, die Sie für verschiedene Geräte erhalten können. Gleiches gilt für write().

Für Sockets, FIFOs und andere IPC-Mechanismen würde ich Unix Network Programming, Volumes 1 und 2 lesen. IIRC beschreibt, welche Art von Fehlern bei verschiedenen Fehlerbedingungen zu erwarten sind.

Ich bin diesen Weg einmal mit FIFOs gegangen. Letztendlich habe ich mir alle Möglichkeiten ausgedacht, wie der Produzent und der Konsument mit jedem Ende des FIFO interagieren könnten, und dann Testfälle für jede dieser Situationen geschrieben. Es war eine gute (wenn auch mühsame) Möglichkeit, all die verschiedenen Fehlerbedingungen zu entdecken. Ich habe jedoch viel gelernt und letztendlich funktioniert der Code jetzt einfach.

  • während interresting, das nicht die Frage beantwortet. Wenn ich Ihre Antwort richtig verstehe, sprechen Sie von möglichen Fehlerbedingungen (errno), die beim Lesen ausgelöst werden, und das hat nichts mit exceptfds zu tun

    – kriss

    24. August 2016 um 9:47 Uhr

  • Das war vor sieben Jahren. Ich wünschte, ich könnte Ihnen sagen, worauf ich mich bezog, aber ich kann mich nicht einmal daran erinnern, diese Antwort geschrieben zu haben. Entschuldigung, ich werde meine Aussagen nicht für Sie erklären können.

    – Rob Jones

    10. September 2016 um 20:22 Uhr

1404580cookie-check* nix select und exceptfds/errorfds-Semantik

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy