relibc научилась управлять терминалом: tcdrain, tcflow и tcsendbreak

07.07.2026

В relibc появились реализации tcdrain, tcflow и tcsendbreak — трёх функций termios, которых на Redox до этого не было. Программы на Rust, работающие с последовательным портом или псевдотерминалом, получают полный набор управления потоком.

Зачем нужны эти три функции

Все три — из POSIX, и все три управляют тем, как терминал отдаёт данные в физический канал.

tcdrain(fd) блокирует вызывающий поток, пока все уже записанные байты не уйдут в устройство. Без неё write возвращается сразу после копирования в буфер ядра, и данные могут быть потеряны при аварийном завершении процесса или при перезагрузке.

tcflow(fd, action) останавливает и возобновляет передачу: TCOOFF приостанавливает вывод, TCOON продолжает, TCIOFF и TCION делают то же для ввода. Это позволяет программе временно перехватывать поток — например, чтобы перенаправить его на свой терминальный эмулятор.

tcsendbreak(fd, duration) отправляет последовательность BREAK на линии: ноль битов в течении заданного времени плюс пробел. По этому сигналу модем и последовательное оборудование сбрасывают состояние линии, и по нему же управляют потоком в канале.

Что именно изменилось

Работа затронула только слой relibc: обработчики ioctl в sys_ioctl. Ядро менять не пришлось — нужные команды оно уже понимало, не хватало обвязки на стороне libc. Функции экспортированы, поэтому их видят и программы на C, и код на Rust, идущий через libc.

Практическая польза

Возможность дренировать терминал перед завершением работы важна там, где потеря последних байтов обрывает протокол: загрузчик, прошивальщик, программа настройки оборудования. Управление потоком через tcflow — основа telnet-подобных решений и отладочных мостов. BREAK до этого нельзя было отправить вообще никак.

Оригинал

Коммит sys_ioctl: add Redox implementations for tcdrain, tcflow, and tcsendbreak в репозитории redox-os/relibc; сводка «This Month in Redox — July 2026», раздел «Relibc Improvements»

Упоминаний: 1 · Просмотров: 2