1) Есть ли лучший способ закрыть экземпляр "экрана", чем тот, который я использовал?
Это не имеет значения, если ваша программа сделана независимой любой предыдущей конфигурации и выполняет свою собственную полную инициализацию.
2) Почему «open» не возвращает?
printf после open () никогда не запускается, когда в этом режиме порт заблокирован
Системный вызов open () для последовательного терминала может блокироваться, если не установлена линия DCD (Data Carrier Detect) от модема.
Ваша программа может игнорировать состояние линии DCD во время open () , указав опцию O_NONBLOCK, например:
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
Однако эта опция также переведет последовательный терминал в неблокирующий режим, который заставит ваше приложение (неэффективно) опрашивать систему на предмет чтения данных вместо использования предпочтительной управляемой событиями возможности.
Ваша программа может вернуться в режим блокировки, выполнив fcntl () * 10 24 * вызов для очистки опции неблокирования, например:
fcntl(fd, F_SETFL, 0);
Выше фактически очищаются пять изменяемых флагов состояния файла, то есть O_APPEND, O_ASYN C, O_DIRECT, O_NOATIME и O_NONBLOCK.
Код ядра Linux, который блокирует open () последовательного терминала от продолжения, является while (1)
l oop в tty_port_block_til_ready () .
Обратите внимание, что если при предыдущем открытии последовательного терминала был установлен флаг CLOCAL term ios, то не предполагается, что модем подключен, и проверка на DCD прекращена.