/ / Erkennen, ob eine geöffnete Datei / Gerät ersetzt / gelöscht wurde - Linux, Dateisysteme, Überwachung, Udev, usbserial

Ermitteln, ob eine offene Datei / ein Gerät ersetzt / gelöscht wurde - Linux, Dateisysteme, Überwachung, udev, usbserial

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 № 1

Wenn 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/ttyUSB0und vergleiche das st_ino Felder der beiden struct stats.

Und lass mich wissen, ob es tatsächlich funktioniert. :-)