Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

};

int tcgetattr(int fd, struct termios * tp);

int tcsetattr(int fd, int oact, struct termios * tp);

Почти в каждом случае программы должны использовать

tcgetattr
для получения текущих установок устройства, модифицировать эти установки, а затем применять
tcsetattr
для активизации модифицированных установок. Многие программы также сохраняют копии оригинальных установок и восстанавливают их перед завершением. В общем случае, следует модифицировать только интересующие вас установки; изменение других установок может усложнить работу пользователей с необычными системными конфигурациями (или сбоями в вашем коде).

Вызов

tcsetattr
может не принять на обработку выбранные вами установки; разрешено игнорировать произвольные установки. Если оборудование просто не поддерживает установку,
tcsetattr
игнорирует ее, а не возвращает ошибку. Если вам небезразлично воздействие, оказываемое установкой, следует использовать
tcgetattr
после
tcsetattr
и проверить, оказало ли воздействие внесенное вами изменение.

Для получения установок устройства tty необходимо открыть устройство и передать файловый дескриптор

tcgetattr
. Это вызывает проблемы с некоторыми устройствами tty; некоторые обычно можно открыть лишь один раз с целью предотвращения конфликта устройств. К счастью, передача флага
O_NONBLOCK
в
open
вызывает его немедленное открытие и предотвращает блокирование любых операций. Однако все равно можно предпочесть блокирование
read
; в таком случае используйте
fcntl
для отключения режима
O_NONBLOCK
перед тем, как появится возможность читать или записывать в него.

fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);

Четыре флага

termios
контролируют четыре отдельных части управления вводом и выводом. Флаг входных данных,
с_iflag
, определяет, каким образом интерпретируются и обрабатываются принятые символы. Флаг выходных данных,
c_oflag
, определяет, каким образом интерпретируются и обрабатываются символы, записываемые вашим процессом в tty. Управляющий флаг,
c_cflag
, определяет характеристики последовательного протокола устройства и полезен лишь для физических устройств. Локальный флаг,
c_lflag
, определяет, каким образом символы собираются и обрабатываются перед отправкой на обработку выходных данных. На рис. 16.1 показана упрощенная схема того, какое место занимает каждый флаг в общей схеме обработки символов.

Рис. 16.1. Упрощенная схема обработки tty

Сначала мы продемонстрируем способы применения

termios
, а затем представим короткую справку о нем.

16.3. Примеры использования

termios

16.3.1. Пароли

Самой распространенной причиной модификации установок

termios
является чтение пароля без эхо-контроля символов. Для этого следует отключить локальное эхо во время чтения пароля. Ваш код должен выглядеть следующим образом:

struct termios ts, ots;

Первая структура хранит оригинальные установки для восстановления, а вторая является копией для модификации.

tcgetattr(STDIN_FILENO, &ts);

Обычно пароли читаются со стандартного устройства ввода.

ots = ts;

Сохраните копию оригинальных установок

termios
, чтобы позже восстановить их.

ts.c_lflag &= ~ECHO;

ts.c_lflag |= ECHONL;

tcsetattr(STDIN_FILENO, TCSAFLUSH, fits);

Отключите эхо-контроль символов (кроме символов новой строки) после завершения обработки всех выходных данных. (Первая

l
в
c_lflag
означает локальную (local) обработку.)

read_password;

Теперь вы читаете пароль. Это может быть простой вызов

fgets
или
read
, либо же более сложная обработка, в зависимости от режима tty (неформатируемый режим или режим обработки) и от требований программы.

tcsetattr(STDIN_FILENO, TCSANOW, &ots);

Это немедленно восстанавливает исходные установки

termios
. (Остальные опции объясняются позже, в справочном разделе далее в главе.)

Полный код программы-примера,

readpass
, показан ниже.

 1: /* readpass.с */

 2:

 3: #include <stdio.h>

 4: #include <stdlib.h>

 5: #include <termios.h>

 6: #include <unistd.h>

 7:

 8: int main (void) {

 9: struct termios ts, ots;

10: char passbuf[1024];

11:

12: /* получить и сохранить текущие настройки termios */

13: tcgetattr(STDIN_FILENO, &ts);

14: ots = ts;

15:

16: /* изменить и установить новые настройки termios */

17: ts.c_lflag & = ~ECHO;

18: ts.c_lflag |= ECHONL;

  • Читать дальше
  • 1
  • ...
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: