Nehmen Sie die folgende Situation unter Linux an:
Ein Prozess liest kontinuierlich von einem USB-Seriell-Konverter (/dev/ttyUSB0
). Das Gerät ist plötzlich unplugged und wieder angeschlossen (oder setzt sich aus irgendeinem Grund zurück). Der Prozess hat weiterhin ein gültiges Dateihandle für /dev/ttyUSB0
Sie erhalten jedoch keine Daten vom Gerät, es sei denn, der Prozess öffnet das Gerät erneut (weil udev hat den Geräteknoten gelöscht und neu erstellt).
Gibt es ein Direkte Weg, um eine solche Situation zu erkennen (dh. nicht indirekt durch Erkennen eines Timeouts im Datenfluss), sodass der Prozess weiß, dass er das Gerät erneut öffnen muss? Wäre es zuverlässig, die Änderungszeit von zu überwachen? /dev/ttyUSB0
verwenden stat()
?
Weitere Details:
Der Prozess öffnet die Gerätedatei unter Verwendung des Standards open()
Funktion.
/dev
ist ein tmpfs
kontrolliert von udev
.
Hinweis: ich mache nicht will keine verwenden udev Regeln dafür und bevorzugen eine direkt im Prozess implementierte Lösung.
Antworten:
1 für die Antwort № 1Wenn ein USB-Gerät im heißen Zustand entfernt wurde, schlagen die Vorgänge auf dem Gerät fehl -EIO
; Sie können dies erkennen und entsprechende Maßnahmen ergreifen.
0 für die Antwort № 2
Ich denke FAM
oder gamin
wird diese Ereignisse erkennen.
0 für die Antwort № 3
Wenn der Geräteknoten tatsächlich entfernt und neu erstellt wird (was ich glaube, wenn Sie udev haben), sollten Sie die Inode-Nummer verwenden können, um festzustellen, wann dies geschieht.
Ruf einfach an fstat()
auf Ihrem offenen Dateideskriptor, stat()
auf /dev/ttyUSB0
und vergleiche das st_ino
Felder der beiden struct stat
s.
Und lass mich wissen, ob es tatsächlich funktioniert. :-)