Функция open (2) зависает при попытке открыть последовательный порт в MacOS

У меня возникла проблема, когда функция открытия никогда не возвращается, когда я пытаюсь открыть последовательный порт. . Это происходит не все время, и проблема на время исчезает, если я отсоединяю 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 () процесс не может быть прерван с помощью команды-. (Ctrl + C).
  • Выполнение ps -avx показывает код состояния процесса U для процесса. Я не уверен, что означает этот код. Он не появляется на страницах руководства для ps , найденных в Google. На моей машине нет списка кодов состояния процесса на странице руководства для ps . Возможно, это характерно для Mac (10.4+?) Версии ps ?
  • Я заметил, что во время выполнения, непосредственно перед первым появлением этой проблемы, мой вызов ioctl () , чтобы вернуть параметры порта в их состояние до того, как я изменил их для использования в моей программе. Пришлось убить программу (через отладчик Xcode). Сразу после этого при следующем запуске программы open () завис ...
18
задан jww 14 November 2019 в 00:57
поделиться