Кроме того, существуют флаги задержки, которые устанавливать не нужно; они предназначены для компенсации старого, плохо спроектированного и на данный момент, к счастью, редко встречающегося оборудования. За управление флагами задержки ответственны библиотеки termcap и terminfo. Это означает, что в их модификации нет необходимости. В [37] они упомянуты как устаревшие. Ядро Linux не реализует их в данный момент, и, поскольку это свойство не пользуется спросом, они вряд ли будут реализованы в будущем.
16.5.6. Управляющие флаги
Флаги режима управления влияют на такие параметры протокола, как четность и управление потоком[114]. Флаги, устанавливаемые в с_cflag, описаны ниже.
CLOCAL При установке CLOCAL линии управления модемом игнорируются. Если он не установлен, open() блокируется до тех пор, пока модем не объявит состояние ответа абонента, утвердив линию обнаружения несущей. CREAD Символы могут приниматься только в случае установки CREAD. Его сбрасывать не обязательно. (
Примечание. Попробуйте запустить stty -cread.) CSIZE CSIZE — это маска для кодов, устанавливающих размер передаваемого символа в битах. Размер символа следует установить в перечисленные ниже значения. CS5 для пяти бит на символ; CS6 для шести бит на символ; CS7 для семи бит на символ; CS8 для восьми бит на символ. CSTOPB При установке CSTOPB на конце каждого кадра символа генерируется по два стоповых бита. Если CSTOPB не установлен, генерируется лишь по одному стоповому биту. Устаревшее оборудование, требующее двух стоповых битов, встречается редко. HUPCL Если установлен, то при закрытии последнего открытого файлового дескриптора на устройстве уровень на линиях последовательного порта DTR и RTS (если они существуют) будет снижен, чтобы заставить модем разорвать соединение. То есть, например, если пользователь, вошедший в систему через модем, затем выходит из нее, модем разрывает соединение. Если программа передачи данных открывает устройство для исходящих вызовов, а процесс затем закрывает устройство (или завершается), модем разорвет соединение. PARENB и PARODD При установке PARENB генерируется бит четности. Если PARODD не установлен, генерируется проверка на четность. Если PARODD установлен, генерируется проверка нечетность. Если PARENB не установлен, PARODD игнорируется. CRTSCTS Использовать аппаратное управление потоком (линии RTS и CTS). При высоких скоростях (19 200 бит/с и более) программное управление потоком с помощью символов XON и XOFF становится неэффективным. Вместо этого следует использовать аппаратное управление потоком. Этот флаг не определен в POSIX и не доступен под этим именем в большинстве других систем Unix. Это особенно непереносимая область управления терминалом, несмотря на распространенную потребность в аппаратном управлении потоком в современных системах. Система SVR4 особенно характерна тем, что она не предоставляет возможности установки управления потоком с помощью termios, а только через другой интерфейс под названием termiox.
16.5.7. Управляющие символы
Управляющие символы — это символы со специальными значениями, которые могут отличаться в зависимости от того, находится ли терминал в каноническом или неформатируемом режиме ввода, и в зависимости от установок различных управляющих флагов. Каждое смещение (кроме VMIN и VTIME) в массиве с_сс обозначает действие и содержит код символа, предназначенный для этого действия. Например, установите символ прерывания на Control-C с помощью следующего кода:
ts.с_сс[VINTR] = CTRLCHAR('С');
Макрос CTRLCHAR() определен как
#define CTRLCHAR(ch) ((ch)&0x1F)
Некоторые системы имеют макрос CTRL(), определенный в <termios.h>, но не поддерживаемый во всех системах, поэтому определение нашей собственной версии будет более надежным. Мы используем запись ^C для обозначения Control-C.
Расположения символов, не определенные POSIX, активны только в случае установки локального управляющего флага IEXTEN(c_lflag).
Управляющие символы, которые вы видите как индексы массива с_сс, перечислены ниже.
VINTR Смещение VINTR обычно устанавливается в ^C. Оно обычно сбрасывает на диск очереди ввода-вывода и передает SIGINT элементам группы процесса переднего плана, ассоциированным с tty. Процессы, неявно обрабатывающие SIGINT, немедленно завершаются. VQUIT Смещение VQUIT обычно устанавливается в ^. Оно обычно сбрасывает на диск очереди ввода-вывода и передает SIGQUIT элементам группы процесса переднего плана, ассоциированным с tty. Процессы, неявно обрабатывающие SIGQUIT, завершаются, при возможности сброса дампа ядра (см. главу 10). VERASE Смещение VERASE обычно устанавливается в ^H или ^?. В каноническом режиме оно обычно стирает предыдущий символ в строке. В неформатируемом режиме это несущественно. VKILL Смещение VKILL обычно установлено в ^U. В каноническом режиме оно обычно стирает всю строку. В неформатируемом режиме это несущественно. VEOF Смещение VEOF обычно установлено в ^D. В каноническом режиме оно заставляет read() на файловом дескрипторе возвращать 0, сигнализируя о состоянии конца файла. На некоторых системах оно может делить пространство с символом VMIN, активным лишь в неформатируемом режиме. (Это не проблема, если вы сохраните struct termios с каноническими установками режима для восстановления действий в неформатируемом режиме, что все равно присуще практике программирования с применением termios.) VSTOP Смещение VSTOP обычно установлено в ^S. Оно заставляет tty приостановить передачу выходных данных до получения символа VSTART, или, в случае установки IXANY, до получения любого символа. VSTART Смещение VSTART обычно установлено в ^Q. Оно запускает приостановленный вывод tty. VSUSP Смещение VSUSP обычно установлено в ^Z. Оно вызывает передачу SIGTSTP текущей группе процессов переднего плана; более подробно об этом рассказывается в главе 15. VEOL и VEOL2 В каноническом режиме эти символы, а также символ новой строки ('n'), сигнализируют о состоянии конца строки. Это вызывает передачу скомпонованного буфера и запуск нового буфера. На некоторых системах VEOL может делить пространство с символом VTIME, активным лишь в неформатируемом режиме, так же, как VEOF может делить пространство с VMIN. Символ VEOL2 в POSIX не определен. VREPRINT Смещение VREPRINT обычно установлено в ^R. В каноническом режиме в случае установки флага ECHO оно вызывает локальное отражение символа VREPRINT, новой строки (и возврата каретки, если это допустимо), а также перепечатку всего текущего буфера. Этот символ в POSIX не определен. VWERASE Смещение WERASE обычно установлено в ^W. В каноническом режиме оно стирает все пробелы в конце буфера, затем все остальные символы, что дает эффект стирания предыдущего слова в строке. Этот символ в POSIX не определен. VLNEXT Смещение VLNEXT обычно установлено в ^V. Само оно не вводится в буфер, но вызывает литеральное помещение в буфер следующего символа, даже если это один из управляющих символов. Для того чтобы ввести один литеральный символ VLNEXT, введите его дважды. Этот символ в POSIX не определен.
Для отключения любой позиции управляющего символа установите его значение в _POSIX_VDISABLE. Это работает только в случае определения _POSIX_VDISABLE как значения, не равного -1. _POSIX_VDISABLE работает в Linux, но переносимая программа, к сожалению, не сможет зависеть от отключения расположений управляющих символов во всех системах.