Читаем Основы программирования в Linux полностью

int tcsetattr(int fd, int actions, const struct termios *termios_p);

Поле actions функции tcsetattr управляет способом внесения изменений. Есть три варианта:

TCSANOW — изменяет значения сразу;

TSCADRAIN — изменяет значения, когда текущий вывод завершен;

TCSAFLUSH — изменяет значения, когда текущий вывод завершен, но отбрасывает любой ввод, доступный в текущий момент и все еще не возвращенный вызовом read.

Примечание

Учтите, что для программ очень важно восстановить настройки терминала, действующие до начала выполнения программы. За первоначальное сохранение значений и их восстановление после завершения выполнения всегда отвечает программа.

Теперь рассмотрим более подробно режимы и связанные с ними вызовы функций. Некоторые характеристики режимов довольно специализированные и редко применяются, поэтому мы остановимся только на основных. Если вы хотите знать больше, просмотрите страницы интерактивного справочного руководства вашей системы либо скопируйте стандарт POSIX или X/Open.

Наиболее важный режим, который следует принять во внимание при первом прочтении, — локальный (local). Канонический и неканонический режимы — решение второй проблемы в вашем первом приложении: пользователь должен нажимать клавишу или для чтения программой входных данных. Вам следует заставить программу ждать всю строку ввода или набрасываться на ввод, как только он набран на клавиатуре.

<p>Режимы ввода</p>

Режимы ввода управляют тем, как обрабатывается ввод (символы, полученные драйвером терминала от последовательного порта или клавиатуры) до передачи его в программу. Вы управляете вводом, устанавливая флаги в элементе c_iflag структуры termios. Все флаги определены как макросы и могут комбинироваться с помощью поразрядной операции OR. Это свойственно всем режимам терминала.

В элементе c_iflag могут применяться следующие макросы:

 BRKINT — генерирует прерывание, когда в линии связи обнаруживается разрыв (потеря соединения);

 IGNBRK — игнорирует разрывы соединения в линии связи;

 ICRNL — преобразует полученный символ возврата каретки в символ перехода на новую строку;

 IGNCR — игнорирует полученные символы возврата каретки;

 INLCR — преобразует полученные символы перехода на новую строку в символы возврата каретки;

 IGNPAR — игнорирует символы с ошибками четности;

 INCPK — выполняет контроль четности у полученных символов;

 PARMRK — помечает ошибки четности;

 ISTRIP — обрезает (до семи битов) все входные символы;

 IXOFF — включает программное управление потоком при вводе;

 IXON — включает программное управление потоком при выводе.

Примечание

Если флаги BRKINT и IGNBRK не установлены, сбой на линии связи считывается как символ NULL (0x00).

Вам не придется часто изменять режимы ввода, поскольку обычно стандартные значения — наиболее подходящие, и поэтому мы больше не будем их обсуждать.

<p>Режимы вывода</p>

Эти режимы управляют способом обработки выводимых символов, т.е. тем, как символы, полученные от программы, обрабатываются перед передачей на последовательный порт или экран. Как и следовало ожидать, многие из них — оборотная сторона режимов ввода. Есть несколько дополнительных флагов, которые связаны в основном с разрешениями для медленных терминалов, которым требуется время для обработки таких символов, как возвраты каретки. Почти все они либо избыточны (поскольку терминалы стали быстрее) или лучше обрабатываются с помощью базы данных характеристик терминала terminfo, которую вы примените позже в этой главе.

Вы управляете режимами вывода, устанавливая флаги элемента c_oflag структуры типа termios. В элементе c_oflag могут применяться следующие макросы:

 OPOST — включает обработку вывода;

 ONLCR — преобразует в символ перевода строки пару символов возврат каретки/перевод строки;

 OCRNL — преобразует любой символ возврата каретки в выводе в символ перевода строки;

 ONOCR — не выводит символ возврата каретки в столбце 0;

 ONLRET — символ перехода на новую строку выполняет возврат каретки;

 OFILL — посылает символы заполнения для формирования задержки;

 OFDEL — применяет символ DEL как заполнитель вместо символа NULL;

 NLDLY — выбор задержки для символа перехода на новую строку;

 CRDLY — выбор задержки для символа возврата каретки;

 TABDLY — выбор задержки для символа табуляции;

 BSDLY — выбор задержки для символа Backspace;

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже