Wie man mit den Linux-socket-revents POLLERR, POLLHUP und POLLNVAL?
Frage ich mich, was getan werden sollte, wenn die Umfrage setzen diese bits? Schließen Sie die Buchse, es ignorieren oder was?
- Kein Zusammenhang zu dieser Frage, was ist Ihre Absicht?
- Ist es wirklich benötigen? Ich Frage nur für best practices...
- "Ich bin nur zu Fragen, für "best practices" sollten Sie etwas aufwendiger zu diesem Punkt aber 😛 ...
- aufwändige, über was? Die OP würde gerne wissen, wie Sie damit umgehen können. Ich sehe nicht wirklich, wie diese, ist unklar. Ich bin nicht sicher, was mehr Kontext benötigt wird...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
POLLHUP
bedeutet, dass die Buchse ist nicht mehr verbunden. Bei TCP bedeutet dies, FIN wurde empfangen und gesendet werden.Einen
POLLERR
bedeutet, dass die Buchse bekam eine asynchrone Fehler. In TCP, dies bedeutet in der Regel ein RST empfangen wurde oder gesendet werden. Wenn der file-Deskriptor ist kein socket,POLLERR
könnte bedeuten, das Gerät unterstützt nicht abrufen.Für beide der oben genannten Bedingungen, wird das socket-file-Deskriptor ist noch offen, und noch nicht geschlossen wurde (aber
shutdown()
haben vielleicht schon genannt worden). Einclose()
auf der file-Deskriptor wird die Freigabe von Ressourcen, die derzeit noch reserviert auf den Namen der Steckdose. In der Theorie sollte es möglich sein, die Wiederverwendung der socket sofort (z.B. mit einem anderenconnect()
nennen).Einen
POLLNVAL
bedeutet, dass der socket-file-Deskriptor ist nicht geöffnet. Es wäre ein Fehler zuclose()
es.Es hängt von den genauen Fehler der Natur. Verwenden getsockopt (), um zu sehen, das problem:
Werte: http://www.xinotes.net/notes/note/1793/
Der einfachste Weg ist zu vermuten, dass die Steckdose nicht mehr nutzbar, in jedem Fall und schließen Sie es.
SO_ERROR
wird dokumentiert, um wieder den Fehler-status der Steckdose, aber es Verwendung für die Erkennung von socket-Fehler-Zustand wird nur beschrieben, für dieconnect()
nennen, und nicht für irgendwelche anderen.POLLNVAL
bedeutet, dass die Datei-Deskriptor-Wert ist ungültig. In der Regel gibt es einen Fehler in Ihrem Programm, aber Sie können sich darauf verlassenpoll
RückkehrPOLLNVAL
wenn Sie schon geschlossen ist, wird ein Datei-Deskriptor ist und Sie nicht geöffnet habe eine Datei da, dann könnte das haben, wiederverwendet, dem Deskriptor.POLLERR
ist ähnlich Fehler Ereignisse ausselect
. Es zeigt an, dass einread
oderwrite
Aufruf würde einen Fehler zurück Bedingung (z.B. I/O-Fehler). Dies schließt nicht out-of-band-Daten, dieselect
Signale über seineerrorfds
Maske aberpoll
Signale überPOLLPRI
.POLLHUP
im Grunde bedeutet, dass das, was am anderen Ende der Verbindung wurde geschlossen das Ende der Verbindung. POSIX beschreibt es alsDies ist deutlich genug für ein terminal: das terminal ist Weg (gleiche Ereignis, das generiert ein SIGHUP: der modem-Sitzung beendet wurde, wird die terminal-emulator-Fenster geschlossen wurde, etc.).
POLLHUP
nie gesendet, die für eine reguläre Datei. Für pipes und sockets, es hängt vom Betriebssystem ab. Linux setztPOLLHUP
wenn das Programm auf das schreiben Ende des Rohres schließt das Rohr und legtPOLLIN|POLLHUP
wenn das andere Ende an eine Steckdose geschlossen die Buchse, aberPOLLIN
nur für ein Herunterfahren des Sockets. Den letzten *BSD-setPOLLIN|POLLUP
wenn das schreiben Ende des Rohrs schließt die pipe, und das Verhalten für Steckdosen ist variabler.Minimale FIFO Beispiel
Sobald Sie verstehen, dass, wenn diese Bedingungen passieren, es sollte einfach sein, zu wissen, was mit Ihnen zu tun.
Kompilieren mit:
Verwendung:
Auf eine andere shell:
POLLHUP
Wenn Sie nicht ändern Sie die Quelle:
./poll.out
Ausgänge:Also:
POLLIN
passiert, wenn Eingabe verfügbarPOLLHUP
passiert, wenn die Datei geschlossen ist, durch dieprintf
close(pfd.fd);
undpfd.fd *= -1;
saubere Dinge, und das werden wir nicht mehr erhaltenPOLLHUP
poll
hängt immerDies ist der normale Betrieb.
Könnte man jetzt repoen der FIFO warten, bis die nächste
open
oder beenden Sie die Schleife, wenn Sie fertig sind.POLLNAL
Wenn Sie kommentieren Sie
pfd.fd *= -1;
:./poll.out
Drucke:Schleifen und für immer.
Also:
POLLIN
undPOLLHUP
undclose
geschah, als Sie vorpfd.fd
eine negative Zahl,poll
hält zu versuchen, diefd
dass wir geschlossenPOLLNVAL
immerSo sehen wir, dass dies nicht geschehen ist, und weist auf einen Fehler in deinem code.
POLLERR
Ich weiß nicht, wie das generieren eines
POLLERR
mit FIFOs. Lassen Sie mich wissen, wenn es Weg ist. Aber es sollte möglich sein, mitfile_operations
zu einem Gerätetreiber.Getestet in Ubuntu 14.04.