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

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

Жанры

Основы программирования в 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.с, включенного в нее. Внесенные изменения выделены цветом и объясняются в пунктах описания.

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

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Шайтан Иван

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Том 5. Пешком по Европе. Принц и нищий.

Твен Марк
Проза:
классическая проза
5.00
рейтинг книги
Том 5. Пешком по Европе. Принц и нищий.

Легат

Прокофьев Роман Юрьевич
6. Стеллар
Фантастика:
боевая фантастика
рпг
6.73
рейтинг книги
Легат

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Обрыв

Гончаров Иван Александрович
Проза:
классическая проза
русская классическая проза
8.93
рейтинг книги
Обрыв

После развода. Я смогу (наверное)

Верди Алиса
6. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
После развода. Я смогу (наверное)

На границе империй. Том 3

INDIGO
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
На границе империй. Том 3

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Эпоха Опустошителя. Том IX

Павлов Вел
9. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том IX

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.42
рейтинг книги
Стеллар. Заклинатель

Ваше Сиятельство 9

Моури Эрли
9. Ваше Сиятельство
Фантастика:
боевая фантастика
попаданцы
стимпанк
аниме
фэнтези
5.00
рейтинг книги
Ваше Сиятельство 9

Эволюционер из трущоб. Том 14

Панарин Антон
14. Эволюционер из трущоб
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 14