Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

В вызовах перечисленных функций допускается задание разных значений скорости

speed
, но к основным относятся следующие константы:

 

B0
— отключение терминала;

 

B1200
— 1200 бод;

 

B2400
— 2400 бод;

 

B9600
— 9600 бод;

 

B19200
— 19 200 бод;

 

B38400
— 38 400 бод.

Не существует скоростей выше 38 400 бод, задаваемых стандартом, и стандартного метода обслуживания последовательных портов на более высоких скоростях.

Примечание

В некоторых системах, включая Linux, для выбора более высоких скоростей определены константы

В57600
,
B115200
и
В230400
. Если вы пользуетесь более старой версией ОС Linux и эти константы недоступны, можно применить команду
setserial
для получения нестандартных скоростей 57 600 и 115 200. В этом случае указанные скорости будут использоваться при выборе константы B38400. Оба эти метода непереносимы, поэтому применяйте их с осторожностью.

Дополнительные функции

Есть небольшое число дополнительных функций для управления терминалами. Они работают непосредственно с дескрипторами файлов без необходимости считывания и записывания структур типа

termios
.

#include <termios.h>

int tcdrain(int fd);

int tcflow(int fd, int flowtype);

int tcflush(int fd, int in_out_selector);

Функции предназначены для следующих целей:

 

tcdrain
— заставляет вызвавшую программу ждать до тех пор, пока не будет отправлен весь поставленный в очередь вывод;

 

tcflow
— применяется для приостановки или возобновления вывода;

 

tcflush
— может применяться для отказа от входных или выходных данных либо и тех, и других.

Теперь, когда мы уделили довольно много внимания структуре

termios
, давайте рассмотрим несколько практических примеров. Возможно, самый простой из них — отключение отображения при чтении пароля (упражнение 5.4). Это делается сбрасыванием флага
echo
.

Упражнение 5.4. Программа ввода пароля с применение
termios

1. Начните вашу программу password.с со следующих определений:

#include <termios.h>

#include <stdio.h>

#include <stdlib.h>

#define PASSWORD_LEN 8

int main {

 struct termios initialrsettings, newrsettings;

 char password[PASSWORD_LEN + 1];

2. Далее добавьте строку, считывающую текущие установки из стандартного ввода и копирующую их в только что созданную вами структуру типа

termios
:

 tcgetattr(fileno(stdin), &initialrsettings);

3. Создайте копию исходных установок, чтобы восстановить их в конце. Сбросьте флаг

ECHO
в переменной
newrsettings
и запросите у пользователя его пароль:

 newrsettings = initialrsettings;

 newrsettings.с_lflag &= ~ЕСНО;

 printf("Enter password: ");

4. Далее установите атрибуты терминала в newrsettings и считайте пароль. И наконец, восстановите первоначальные значения атрибутов терминала и выведите пароль на экран, чтобы свести на нет все предыдущие усилия по обеспечению безопасности:

 if (tcsetattr(fileno(stdin), TCSAFLUSH, &newrsettings) != 0) {

fprintf(stderr, "Could not set attributes\n");

 } else {

fgets(password, PASSWORD_LEN, stdin);

tcsetattr(fileno(stdin), TCSANOW, &initialrsettings);

fprintf(stdout, "\nYou entered %s\n", password);

 }

 exit(0);

}

Когда вы выполните программу, то увидите следующее:

$ ./password

Enter password: You entered hello

$
 

Как это работает

В этом примере слово

hello
набирается на клавиатуре, но не отображается на экране в строке приглашения
Enter password:
. Никакого вывода нет до тех пор, пока пользователь не нажмет клавишу <Enter>.

Будьте осторожны и изменяйте с помощью конструкции

X&=~FLAG
(которая очищает бит, определенный флагом
FLAG
в переменной
X
) только те флаги, которые вам нужно изменить. При необходимости можно воспользоваться конструкцией
X|=FLAG
для установки одиночного бита, определяемого
FLAG
, хотя в предыдущем примере она не понадобилась.

Для установки атрибутов применяется действие

TCSAFLUSH
для очистки буфера клавиатуры, символов, которые пользователи вводили до того, как программа подготовилась к их считыванию. Это хороший способ заставить пользователей не начинать ввод своего пароля, пока не отключено отображение. Перед завершением программы вы также восстанавливаете первоначальные установки.

Другой распространенный пример использования структуры

termios
— перевод терминала в состояние, позволяющее вам считывать каждый набранный символ (упражнение 5.5). Для этого отключается канонический режим и используются параметры
MIN
и
TIME
.

Упражнение 5.5. Считывание каждого символа

Применяя только что полученные знания, вы можете изменить программу menu. Приведенная далее программа menu4.c базируется на программе menu3.c и использует большую часть кода из файла password.с, включенного в нее. Внесенные изменения выделены цветом и объясняются в пунктах описания.

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

Deus vult

Рокотов Алексей
3. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Deus vult

Попаданец на рыбалке. Книги 1-7

Скворцов Владимир Николаевич
Попаданец на рыбалке
Фантастика:
фэнтези
попаданцы
6.88
рейтинг книги
Попаданец на рыбалке. Книги 1-7

Избранное

Маяковский Владимир Владимирович
Поэзия:
поэзия
5.00
рейтинг книги
Избранное

С Д. Том 16

Клеванский Кирилл Сергеевич
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
С Д. Том 16

Брюнетка в клетку

Куликова Галина Михайловна
Детективы:
иронические детективы
8.39
рейтинг книги
Брюнетка в клетку

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Пророчество

Горъ Василий
1. Пророчество
Фантастика:
фэнтези
8.83
рейтинг книги
Пророчество

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Инженерный Парадокс 9

Cyberdawn
9. Инженерный Парадокс
Фантастика:
боевая фантастика
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Инженерный Парадокс 9

Я снова царь. Книга XXXIII

Дрейк Сириус
33. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я снова царь. Книга XXXIII

Застольные беседы

Плутарх
Старинная литература:
античная литература
6.83
рейтинг книги
Застольные беседы

Звездочеты

Марченко Анатолий Тимофеевич
Проза:
военная проза
5.00
рейтинг книги
Звездочеты