LINUX.ORG.RU

Чем через открытый дескриптор определить физическую потерю устройства на которое он указывает?

 ,


0

2

Например. Есть /dev/ttyUSB0, на нем открытый файловый дескриптор (POSIX open), на файловом дескрипторе по кругу вызываются select с read-ом. Вдруг, внезапно выдергиваю usb-кабель, и в результате:
1. /dev/ttyUSB0 пропадает;
2. select() начинает бесконечно выдавать FD_ISSET() == 1 для готовности чтения на нашем декскрипторе.
3. read() при этом все время возвращается прочитав 0 байт.

Такое поведение наблюдается на платформе которая имеется в моём распоряжении (x86_64, linux 4.0.4, GNU libc 2.18), но я не знаю как программа поведёт себя на другой платформе.

Вопрос, каким вызовом переносимо определить факт потери устройства. Сравнение с нулём кол-во прочитанных байт не предлагать.

select() начинает бесконечно выдавать FD_ISSET() == 1 для готовности чтения на нашем декскрипторе.
готовности чтения

В select() же ещё можно передать exceptfds, который для подобных ситуаций вроде и используется.

xaizek ★★★★★ ()

Получение посылки длиной 0 байт это признак EOF (конец файла) в файловой семантике Unix. Дескриптор после этого нужно убрать из набора (FD_CLR) и закрыть (close).

d_a ★★★★★ ()
Ответ на: комментарий от xaizek

++

И с сокетами удобно работать, когда ты еще и exceptfds вкорячиваешь (правда, там еще и таймауты нужно).

anonymous ()
Ответ на: комментарий от xaizek

В select() же ещё можно передать exceptfds, который для подобных ситуаций вроде и используется.

Передавал, не выдаёт.

normann ★★ ()
Ответ на: комментарий от d_a

Получение посылки длиной 0 байт это признак EOF (конец файла) в файловой семантике Unix. Дескриптор после этого нужно убрать из набора (FD_CLR) и закрыть (close).

Понял, спасибо.

normann ★★ ()

Всем большое спасибо за отзывчивость.

normann ★★ ()
Ответ на: комментарий от anonymous

А, брешу, брешу. 0 он выдает. И если FDISSET + read возвращает 0, то однозначно вырубилось устройство. Потому как если данных нет, FDISSET будет 0.

anonymous ()
Ответ на: комментарий от normann

Имеется в виду «если FD_ISSET() возвращает истину, а read() при этом возвращает 0». Если FD_ISSET() возвращает ложь, то читать ничего и не надо пытаться.

intelfx ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.