Для отключения любой позиции управляющего символа установите его значение в _POSIX_VDISABLE. Это работает только в случае определения _POSIX_VDISABLE как значения, не равного -1. _POSIX_VDISABLE работает в Linux, но переносимая программа, к сожалению, не сможет зависеть от отключения расположений управляющих символов во всех системах.
16.5.8. Локальные флаги
Флаги локального режима влияют на локальную обработку, что в какой-то мере относится к способу сбора символов перед их выводом. Когда устройство находится в каноническом режиме (режиме с обработкой), символы отражаются локально без передачи в удаленную систему до тех пор, пока не встретится символ новой строки. На этом этапе передается вся строка, а удаленный конец обрабатывает ее без повторного отражения. В неформатируемом режиме каждый символ передается в удаленную систему в таком виде, в каком он принимается. Иногда символ отображается только удаленной системой, иногда только локальной, а иногда, например, при чтении пароля, он и вовсе не отображается.
Некоторые флаги могут вести себя иначе, в зависимости от того, в каком режиме находится терминал: каноническом или неформатируемом. Флаги, ведущие себя иначе в каноническом и неформатируемом режимах, отмечены.
Флаги, работающие на c_cflag, перечислены ниже.
ICANON |
При установке ICANON включается канонический режим. Если ICANON не установлен, включается неформатируемый режим. |
ECHO |
При установке ECHO включается локальное эхо. Если ECHO не установлен, все остальные флаги, названия которых начинаются с ECHO, эффективно отключаются и функционируют так, как будто они все, кроме ECHONL, не установлены. |
ECHOCTL |
При установке ECHOCTL управляющие символы выводятся как ^C, где С — это символ, формирующийся добавлением восьмеричного 0100 к управляющему символу, по модулю восьмеричного 0200. Поэтому Control-C отображается как ^C, a Control-? (восьмеричный 0177) отображается как ^? (? — это восьмеричный 77). Этот флаг в POSIX не определен. |
ECHOE |
В каноническом режиме при установке ECHOE в случае получения символа ERASE предыдущий символ на дисплее по возможности стирается. |
ECHOK и ECHOKE |
В каноническом режиме при получении символа KILL вся текущая строка стирается из буфера. Если не установлены ни ECHOK, ни ECHOKE, ни ECHOE, выводится представление символа KILL с помощью ECHOCTL (^U по умолчанию) для обозначения стертой строки. Если установлены ECHOE и ECHOK, но ECHOKE не установлен, выводится представление символа KILL с помощью ECHOCTL, сопровождаемое новой строкой, которая затем обрабатывается OPOST в случае установки OPOST. Если установлены ECHOE, ECHOK и ECHOKE, строка стирается. См. описание ECHOPRT для другой вариации на эту тему. Флаг ECHOKE в POSIX не определен. В системах без флага ECHOKE установка флага ECHOK может быть эквивалентна установке и ECHOK, и ECHOKE в Linux. |
ECHONL |
В каноническом режиме при установке ECHONL символы новой строки ('\n') отражаются даже в том случае, если ECHO не установлен. |
ECHOPRT |
В каноническом режиме при установке ECHOPRT символы выводятся при стирании, когда принимаются символы ERASE или WERASE (или KILL, если установлены ECHOK и ECHOKE). Когда принимается первый в последовательности символ стирания, выводится \, а при выводе последнего символа стирания (достигается конец строки или вводится нестертый символ), выводится /. Каждый вводимый вами нормальный символ просто отображается. Поэтому ввод asdf, сопровождаемый двумя символами ERASE, а также df и символом KILL, будет выглядеть следующим образом: asdf\fd/df\fdsa/. Этот флаг полезен для отладки и использования документирующих терминалов вроде первоначального телетайпа, где символы печатаются на бумаге; в другом случае он не пригодится. Этот флаг в POSIX не определен. |
ISIG |
Если установлен ISIG, управляющие символы INTR, QUIT и SUSP вызывают отправку соответствующего сигнала (SIGINT, SIGQUIT или SIGTSTP соответственно; см. главу 12) всем процессам в текущей группе процессов переднего плана на данном tty. |
NOFLSH |
Обычно при получении символов INTR и QUIT очереди ввода и вывода сбрасываются. При установке NOFLSH очереди не сбрасываются. |
TOSTOP |
Если установлен TOSTOP, то в том случае, когда процесс, не находящийся в текущей группе процессов переднего плана, пытается выполнить запись в свой управляющий терминал, передается SIGTTOU всей группе процессов, членом которой является данный процесс. По умолчанию этот сигнал останавливает процесс, как при нажатии комбинации клавиш, соответствующей символу SUSP. |
IEXTEN |
Этот флаг описан в POSIX как определяемый реализацией. Он включает обработку символов ввода, определяемую реализацией. Хотя переносимые программы не устанавливают этот бит, IUCLC и определенные возможности стирания символов в Linux зависимы от его установки. К счастью, он чаще всего разрешен по умолчанию в системах Linux, поскольку ядро изначально разрешает его при установке tty, поэтому обычно не нужно устанавливать его по какой-либо причине. |
16.5.9. Управление read()