Первые две функции, описанные на странице Руководства termios(3C), используются для получения и установки атрибутов терминала. tcgetattr(3C) получает текущие установки терминального устройства. tcsetattr(3C) изменяет эти установки. Эти функции получают и передают требуемые параметры в виде управляющей структуры termios.
Параметры функций tcgetattr(3C) и tcsetattr(3C) таковы:
fildes дескриптор файла, соответствующий терминальному устройству. Для этого дескриптора вызов isatty(3F) должен возвращать ненулевое значение.
optional_actions Комбинация флагов, определенных в <termios.h>. optional_actions определяет, когда должны быть выполнены изменения и что делать с находящимися в буферах устройства данными при изменении параметров.
termios_p указатель на структуру termios. Эта структура содержит флаги и битовые поля, используемые для управления терминальным интерфейсом ввода/вывода. Флаги и поля этой структуры обсуждаются позже.
После исполнения tcgetattr(3C) рекомендуется сохранить копию этой структуры, чтобы программа могла вернуть начальное состояние терминального интерфейса. Дело в том, что функции tcsetattr(3C) изменяют настройки не файлового дескриптора вашего процесса, а настройки драйвера в ядре Unix. Внесенные вами изменения не откатываются автоматически при завершении программы, поэтому ненормально завершившаяся программа может оставить терминал в непригодном для работы состоянии.
В некоторых случаях, для восстановления параметров терминала можно воспользоваться командой stty(1). В Solaris, команда stty sane пытается привести терминал в режим, пригодный для интерактивной работы.
При изменении настроек терминала, вместо того, чтобы формировать значения полей структуры termios самостоятельно, рекомендуется получить текущие настройки терминала вызовом tcgetattr(3C), затем поменять нужные вам параметры в структуре и установить новые параметры вызовом tcsetattr(3C). При этом вы, по возможности, сохраните те настройки, которые пользователь мог сделать до запуска вашей программы. Кроме того, в последующих версиях Solaris и в других Unix-системах, в структуре termios могут появиться дополнительные поля или флаги. Если ваша программа не будет без нужды изменять незнакомые ей настройки, это значительно облегчит её адаптацию к новым версиям Solaris и ее перенос на другие платформы.
Параметр optinal_actions функции tcsetattr(2)
Параметр optional_actions функции tcsetattr(2) может принимать следующие значения:
TCSANOW Атрибуты изменяются немедленно.
TCSADRAIN Изменения атрибутов происходят только после того, как был передан («осушен») весь вывод в fildes. Этот запрос может быть использован при изменении атрибутов, которые влияют на обработку вывода.
TCSAFLUSH Это похоже на TCADRAIN. Изменение происходит после того, как весь вывод в fildes был передан, а непрочитанный ввод сброшен. Например, этот запрос полезен, если нужно проигнорировать все символы в буфере ввода.