У меня есть последовательное устройство, подключенное через USB. Я открыл tty (/dev/ttyACM0) и жду входящие сообщения, которые читаются и обрабатываются, затем жду следующего сообщения. Проблема в том, что если USB-устройство отключается, мой код этого не обнаруживает и по существу зависает.
Одним из решений было бы проверить возвращаемое значение функции read()
. Если оно равно 0, используйте system("lsof ...")
, чтобы проверить, подключена ли она еще. Это могло бы сработать, но мне кажется это довольно неуклюжим. Есть ли лучший способ обнаружить отключение устройства в коде C?
«В случае ошибки возвращается -1, и errno устанавливается соответствующим образом». - согласно странице руководства. Я бы посмотрел на libusb (для более конкретной поддержки USB) и, возможно, на inotify для общих событий файловой системы. Дело в том, что вы ищете не отключение последовательного порта (которое может быть даже не обнаружено, в зависимости от подключенных проводов), а отключение USB.
@Ulrich - да, ты прав, я не могу обнаружить отключение последовательного порта, поэтому мне нужно искать отключение USB. Я думаю, удев...
Если read() возвращает 0, соединение отключено. Не нужно ничего проверять.
Read() иногда возвращает 0, когда устройство подключено и работает нормально.
У вас должна быть возможность опросить событие POLLHUP.
^ Под этим я подразумеваю poll
дескриптор открытого файла tty и проверку наличия флага POLLHUP
в члене struct pollfd
revents
. Вы также можете проверить наличие флага POLLERR
.
Спасибо всем, кто ответил.
Я нашел несколько решений этой проблемы: используя stat()/fstat()
, как описано здесь 1. stat()
вернет -1 с errno==ENOENT, а fstat()
вернет stat.st_nlink=0, когда USB-устройство отключено.
Однако я думаю, что выберу решение poll()
, предложенное @IanAbbott. Кажется, это немного более тесно связано с тем, что я хочу сделать, хотя все вышеперечисленные решения сработали.
Обновите протокол, чтобы он регулярно отправлял сообщение «ping», которое ваша программа отправляет, а затем ожидает ответа в течение определенного периода времени. Если ответа нет, значит, устройство пропало.