Читаем Linux API. Исчерпывающее руководство полностью

Установка данного флага включает канонический режим ввода. Ввод группируется по строкам, а символы EOF, EOL, EOL2, ERASE, LNEXT, KILL, REPRINT и WERASE интерпретируются особым образом (обратите внимание на влияние флага IEXTEN).

IEXTEN

Установка данного флага включает расширенную обработку вводимых символов. Он (равно как и ICANON) требуется для интерпретации следующих символов: EOL2, LNEXT, REPRINT и WERASE. Кроме того, без него не работает флаг IUCLC. В стандарте SUSv3 всего лишь указано, что флаг IEXTEN включает расширенные функции; детали могут варьироваться в зависимости от реализации.

IMAXBEL

В Linux установка данного флага игнорируется. В консоли при заполнении входящей очереди всегда срабатывает звуковой сигнал.

IUTF8

Установка этого флага включает режим с обработкой (англ. cooked mode; см. подраздел 58.6.3), позволяющий корректно интерпретировать ввод символов UTF-8 при редактировании строки.

NOFLSH

По умолчанию, когда при вводе символов INTR, QUIT или SUSP генерируется сигнал, любые дополнительные данные во входящей и исходящей очередях терминала сбрасываются (отклоняются). Во избежание этого устанавливается флаг NOFLSH.

OPOST

Данный флаг включает постобработку вывода. Его наличие требуется для работы любых флагов в поле c_oflag структуры termios (и наоборот — сброс флага OPOST предотвращает любую постобработку вывода).

PARENB, IGNPAR, INPCK, PARMRK и PARODD

Эти флаги относятся к генерированию и проверке соответствия.

Флаг PARENB включает генерирование битов, которые используются для проверки соответствия выводимых и вводимых символов. Если интересует только соответствие выводимых символов, то можно отключить проверку ввода, сбросив флаг INPCK. Сброс и установка флага PARODD делают проверку соответствия четной и нечетной соответственно.

Остальные флаги определяют то, как именно будут обрабатываться вводимые символы с ошибками соответствия. При установленном флаге IGNPAR символ отклоняется (не передается считывающему процессу). В противном случае, если установлен флаг PARMRK, то символ доходит до считывающего процесса, но содержит в начале двухбайтовую последовательность 0377 + 0 (когда флаг PARMRK установлен, а ISTRIP сброшен, настоящий символ с кодом 0377 дублируется и превращается в 0377 + 0377). Если флаг PARMRK сброшен, а INPCK установлен, то символ отклоняется, а считывающему процессу передается нулевой байт. Когда сброшены все три флага, IGNPAR, PARMRK и INPCK, символ передается процессу в исходном виде.

Пример программы

В листинге 58.2 демонстрируется применение функций tcgetattr() и tcsetattr() для выключения флага ECHO, чтобы вводимые символы не отображались на экране. Ниже показан пример того, что можно увидеть при запуске данной программы:

$ ./no_echo

Enter text: Мы вводим текст, который не экранируется,

но при этом считывается

Read: Knock, knock, Neo.

Листинг 58.2. Отключение эхо-контроля в терминале

tty/no_echo.c

#include

#include "tlpi_hdr.h"

#define BUF_SIZE 100

int

main(int argc, char *argv[])

{

struct termios tp, save;

char buf[BUF_SIZE];

/* Получаем текущие параметры терминала, выключаем эхо-контроль */

if (tcgetattr(STDIN_FILENO, &tp) == -1)

errExit("tcgetattr");

save = tp; /* Позже это позволит восстановить параметры */

tp.c_lflag &= ~ECHO; /* Сбрасываем флаг ECHO, остальные биты не трогаем */

if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &tp) == -1)

errExit("tcsetattr");

/* Считываем ввод и отображаем его на экране */

printf("Enter text: ");

fflush(stdout);

if (fgets(buf, BUF_SIZE, stdin) == NULL)

printf("Got end-of-file/error on fgets()\n");

else

printf("\nRead: %s", buf);

/* Восстанавливаем исходные параметры терминала */

if (tcsetattr(STDIN_FILENO, TCSANOW, &save) == -1)

errExit("tcsetattr");

exit(EXIT_SUCCESS);

}

tty/no_echo.c

58.6. Режимы ввода/вывода терминала

Мы уже отмечали, что драйвер терминала способен обрабатывать ввод в каноническом и неканоническом режимах в зависимости от того, установлен ли флаг ICANON. Теперь остановимся на этом более подробно, после чего познакомимся с тремя дополнительными режимами — с обработкой, без обработки и cbreak, которые стали доступными в седьмой редакции системы UNIX. Мы покажем, как указанные режимы эмулируются в современных системах путем установки соответствующих значений в структуре termios.

58.6.1. Канонический режим

Данный режим ввода включается путем установки флага ICANON. Терминальный ввод в каноническом режиме имеет следующие отличительные черты.

• Ввод группируется в строки, в конце каждой из которых находится символ-разделитель: NL, EOL, EOL2 (если установлен флаг IEXTEN), EOF (если только курсор находится не в начале строки) или CR (при установленном флаге ICRNL). Любые разделители, кроме EOF, передаются считывающему процессу (в качестве последнего символа строки).

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных

Все жанры