Как сказать, какое "исключительное условие" заставило select() реагировать на errorfds?

Согласно справочной странице, системный вызов select() предлагает мониторинг трех различных аспектов одного или нескольких файловых дескрипторов: готовы ли они к чтению, готовы ли к записи, или есть "ошибка" или "исключительное условие" (язык меняется) произошло. Какой из них должен контролироваться, указывается через три fd_set аргументы называют readfds, writefds, а также errorfds, Хотя есть много хорошей документации и примеров о правильном использовании readfds а также writefdsЯ вряд ли мог найти что-нибудь полезное на errorfds,

Во всяком случае, по причинам, обсуждаемым ниже, я дал использовать errorfds попытка, и действительно нашел несколько обстоятельств, в которых select() вызов в моем runloop ответил на "исключительное условие" на одном из файловых дескрипторов. Например, TTY, подключенный к PTY, в то время как последний закрывается со своей главной стороны, поднимает такое условие.

Но что теперь? Я знаю, что в дескрипторе файла возникло "исключительное условие", но как вообще я могу узнать, что именно вызвало его? Просто глядя на errno конечно, не дает ответа (на данный момент это всегда 0). Возможно, есть какое-то "волшебное" ioctl что я должен знать?

Некоторые дополнительные сведения: ряд моих программ (в основном написанных на C) связываются с внешним оборудованием через последовательные порты. Для тестирования я также написал простой сервер, который создает PTY, к которому соответствует TTY, к которому мои другие программы могут подключаться, как если бы это был последовательный порт. Хотя на базовом уровне все это работает довольно хорошо, обработка ошибок или других исключительных условий в настоящее время вообще не реализована, что иногда приводит к довольно неприятному поведению. Это должно измениться!

Одно исключительное условие, которое я особенно заинтересован в обнаружении, - это была ли связь разорвана. Например, было бы неплохо заметить, когда порт исчезнет, ​​скажем, потому что пользователь вытянул адаптер USB-последовательный порт. Правильная обработка ошибок чтения и записи, кажется, позволяет избежать самых неприятных из непреднамеренных побочных эффектов, но мне было интересно, есть ли еще (смотреть errorfdsили, возможно, некоторые другие сигналы), что я должен делать. К сожалению, с обработкой сигналов в UNIX я совсем не знаком.

1 ответ

Я знаю, что в дескрипторе файла возникло "исключительное условие", но как вообще я могу узнать, что именно вызвало его? Может быть, есть какой-то "магический" ioctl, о котором мне следует знать?

Вы должны попробовать прочитать 0 байтов. В Linux, по крайней мере, man 2 read состояния:

Если count равен нулю, read() может обнаружить ошибки, описанные ниже.

Так после read(fd, NULL,0) Вы должны иметь errno это говорит вам нечто большее, без необходимости что-либо читать. Слово "ласка" на странице руководства может означать, что это, вероятно, не очень переносимо (см. Чтение (fd, NULL, 0); что оно делает? Оно хорошо определено?)

Другие вопросы по тегам