Я столкнулся с проблемой, когда функция открытия никогда не возвращается, когда я пытаюсь открыть последовательный порт. Это не происходит все время, и проблема исчезает на некоторое время, если я отключаю USB-адаптер от последовательного порта и снова подключаю его. Мой код выглядит следующим образом:
fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY);
где bsdPath - /dev/cu.KeySerial1. Я попытался добавить опцию O_NONBLOCK в команду open, но она все еще зависает.
Конечно, я хотел бы понять, почему это происходит. Я считаю, что независимо от проблемы, с указанным O_NONBLOCK, open должен возвращаться независимо от того, что, даже если он не смог открыть порт. Если не удается открыть порт, fileDescriptor должен быть равен -1, и должен быть установлен errno (я проверяю это сразу после вызова open). Конечно, этого не происходит. Мое предположение неверно? Существует ли какая-то известная причина, по которой open () никогда не возвращается даже с указанным параметром O_NONBLOCK при возникновении ошибки?
Используя последнюю версию драйвера Prolific PL-2303 с адаптером USB-последовательный порт на основе PL-2303 на 10.7.2, я смог воспроизвести эту проблему сегодня снова. Несколько заметок:
- При зависании в вызове
open()
процесс не прерывается с помощью команды-. (Control-C).
- Выполнение
ps -avx
показывает код состояния процесса U для процесса. Я не уверен, что означает этот код. Он не отображается на справочных страницах для ps
, найденных Google. На странице руководства для ps
на моем компьютере нет списка кодов состояний процесса. Возможно, это специфично для Mac (10.4+?) Версии ps
?
- Я заметил, что во время запуска непосредственно перед первым появлением этой проблемы мой вызов
ioctl()
для сброса параметров порта обратно в их состояние, прежде чем я изменил их для использования в моей программе завис. Мне пришлось убить программу (через отладчик Xcode). Сразу после этого при следующем запуске программы open()
зависло ...