macOS блокирует последовательный ввод / вывод - PullRequest
0 голосов
/ 16 мая 2019

Я пишу инструмент как часть набора тестов, который должен обмениваться данными через последовательный порт с некоторым оборудованием, чтобы тестируемый код видел изменение среды.

Итак, я делаю это:

open("/dev/tty.usbmodem14141", O_RDWR | O_NOCTTY);

только там висит. Если я заменю этот вызов на

open("/dev/tty.usbmodem14141", O_RDWR | O_NOCTTY | O_NONBLOCK);

тогда это работает - но я бы предпочел не возиться с select () и друзьями или писать опрос занятых циклов, просто чтобы я мог читать с последовательного порта; для этого и нужен блокирующий ввод / вывод.

Нужно ли делать что-то особенное, чтобы это работало?

1 Ответ

0 голосов
/ 16 мая 2019

Когда вы открыли последовательный терминал в неблокирующем режиме, вы можете очистить флаг состояния файла, чтобы выполнить ввод / вывод в режиме блокировки.

Чтобы очистить флаг состояния неблокирования, вы можете использовать fcntl () , например:

int flags;

flags = fcntl(fd, F_GETFL);
flags &= ~O_NONBLOCK;
fcntl(fd, F_SETFL, flags);

Поскольку версия F_SETFL для Linux может изменять только O_APPEND, O_ASYNC,Флаги O_DIRECT, O_NOATIME и O_NONBLOCK, обычная практика - упростить код до

fcntl(fd, F_SETFL, 0);

(Да, однострочный не обладает такой же степенью переносимости, как рекомендуется в Настройка терминалаПравильно работает .)

...