Хотелось бы, чтобы по приёму сигнала BREAK (лог. 0 в течении 11 и более битовых периодов) очищались буфера данных (это коллизия на шине — всё начинать сначала, а также программа принимала сигнал SIGINT, например.
Примерно это и обещает документация (man tcsetattr) если установлен BRKINT и сброшены IGNBRK в c_iflag. Но там же указывается — только если последовательный порт является «управляющим терминалом» для процесса. Последнее условие очень мешает.
Что приходит в голову. После открывания порта сохранить свой pid, сделать fork, сделать setsid, переоткрыть (это вообще поможет?) открытый порт без O_NOCTTY... по получении SIGINT делать kill(первый pid, SIGUSR1), например.
Как-то это очень ненормально... не?
Можно, конечно, удовлетвориться 0 вместо BREAK (~IGNBRK и ~BRKINT). Это если данные в ASCII, а если нет? Как быть тогда? 0xFF 0 0 тоже не вариант.
Если данные в ASCII, то 0 вместо BREAK вполне удовлетворяет для приёма. Но нужно прекращать передачу после BREAK. Без сигнала пока весь приёмный буфер считает до 0 — долго. С сигналом ok (быстрей для userspace никак уже), но там же в мане написано input and output queues to be flushed — для input это совершенно не нужно (потеряются данные идущие сразу после BREAK, оно ж не моментально всё делается, и потеряются неповреждённые данные до BREAK). Действительно flushed? Получается разумный компромисс, если ASCII, то ориентироваться только по 0 во входном потоке. А если двоичные данные, то извращаться таки как-то с сигналом. Да проще из /proc/tty/driver/serial о BREAK узнать... Что же это такое, какой неудобный интерфейс.