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

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

Жанры

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

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

Архонт росский

Мазин Александр Владимирович
17. Варяг
Фантастика:
попаданцы
5.00
рейтинг книги
Архонт росский

Последний Герой. Том 3

Дамиров Рафаэль
3. Последний герой
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Последний Герой. Том 3

Двойник короля 16

Скабер Артемий
16. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 16

Династия. Феникс

Майерс Александр
5. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Династия. Феникс

Кодекс Императора

Сапфир Олег
1. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
4.25
рейтинг книги
Кодекс Императора

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Законы Рода. Том 9

Мельник Андрей
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Я еще барон. Книга III

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

Жертва

Привалов Сергей
2. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Жертва

Уникум

Поселягин Владимир Геннадьевич
1. Уникум
Фантастика:
альтернативная история
4.60
рейтинг книги
Уникум

Неудержимый. Книга XXIX

Боярский Андрей
29. Неудержимый
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Неудержимый. Книга XXIX

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

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

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