Определить, был ли открытый файл / устройство заменено / удалено - PullRequest
5 голосов
/ 30 июня 2011

Предположим следующую ситуацию под Linux:

Процесс непрерывно считывает данные с устройства USB-последовательного преобразователя (/dev/ttyUSB0). Это устройство внезапно отключается и подключается снова (или по какой-либо причине перезагружается). Процесс продолжает иметь действительный дескриптор файла для /dev/ttyUSB0, но не получит никаких данных с устройства, пока процесс не повторно откроет устройство (поскольку udev удалил и заново создал узел устройства) .

Существует ли прямой способ обнаружения такой ситуации (т. Е. , а не косвенно путем обнаружения тайм-аута в потоке данных), чтобы процесс знал, что он должен повторно открыть устройство? Будет ли надежным отслеживать время модификации /dev/ttyUSB0 с использованием stat()?

Дополнительные сведения:

Процесс открывает файл устройства с помощью стандартной функции open().

/dev - это tmpfs, управляемый udev.

Примечание: Я не хочу использовать для этого любые udev правила и предпочитаю решение, реализованное непосредственно в процессе.

Ответы [ 3 ]

1 голос
/ 30 июня 2011

Если устройство USB отключено в горячем режиме, операции на устройстве начнут завершаться с ошибкой -EIO; Вы можете обнаружить это и принять соответствующие меры.

1 голос
/ 30 июня 2011

Если узел устройства на самом деле удаляется и воссоздается (что, я думаю, так и есть, если у вас есть udev), тогда вы сможете использовать номер инода, чтобы сообщить, когда это произойдет.

Просто вызовите fstat() в своем дескрипторе открытого файла, stat() на /dev/ttyUSB0 и сравните поля st_ino двух struct stat с.

И дайте мне знать, если это действительно работает. : -)

0 голосов
/ 30 июня 2011

Я думаю FAM или gamin обнаружат эти события

...