Разработка приложений в среде Linux. Второе издание
Шрифт:
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;
19: tcsetattr(STDIN_FILENO, TCSAFLUSH, &ts);
20:
21: /*хоть это и параноидально, но проверить, возымели ли эффект новые настройки*/
22: tcgetattr(STDIN_FILENO, &ts);
23: if (ts.c_lflag & ECHO) {
24: fprintf(stderr, "Сбой при отключении эхо-контроля\n");
25: tcsetattr(STDIN_FILENO, TCSANOW, &ots);
26: exit(1);
27: }
28:
29: /* получить и вывести пароль */
30: printf("введите пароль:");
31: fflush(stdout);
32: fgets(passbuf, 1024, stdin);
33: printf("прочитан
пароль: %s", passbuf);
34: /* в passbuf был завершающий символ \n */
35:
36: /* восстановить старые настройки termios */
37: tcsetattr(STDIN_FILENO, TCSANOW, &ots);
38:
39: exit(0);
40: }
16.3.2. Последовательные коммуникации
В качестве примера программирования обоих концов tty рассмотрим программу, подключающую текущий терминал к последовательному порту. На одном tty программа под названием
robin
сообщается с вами во время набора. На другом tty она взаимодействует с последовательным портом. С целью мультиплексирования вводных и выходных данных на локальном tty и последовательном порте программа использует системный вызов poll
, описанный в главе 13. Ниже приведен полный код программы
robin.с
, за которым даны объяснения. 1: /* robin.с */
2:
3: #include <sys/poll.h>
4: #include <errno.h>
5: #include <fcntl.h>
6: #include <popt.h>
7: #include <stdio.h>
8: #include <stdlib.h>
9: #include <signal.h>
10: #include <string.h> /* для strerror */
11: #include <termios.h>
12: #include <unistd.h>
13:
14: void die(int exitcode, const char *error, const char *addl) {
15: if (error) fprintf(stderr, "%s: %s\n", error, addl);
16: exit(exitcode);
17: }
18:
19: speed_t symbolic_speed(int speednum) {
20: if (speednum >= 460800) return B460800;
21: if (speednum >= 230400) return B230400;
22: if (speednum >= 115200) return B115200;
23: if (speednum >= 57600) return B57600;
24: if (speednum >= 38400) return B38400;
25: if (speednum >= 19200) return B19200;
26: if (speednum >= 9600) return B9600;
27: if (speednum >= 4800) return B4800;
Поделиться:
Популярные книги
Идеальный мир для Лекаря 20
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Пропала, или Как влюбить в себя жену
2. Исцели меня
Любовные романы:
современные любовные романы
6.70
рейтинг книги
Снегурка для опера Морозова
4. Опасная работа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Восхождение Примарха 7
7. Восхождение Примарха
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Хуррит
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Рождение победителя
3. Девятый
Фантастика:
фэнтези
альтернативная история
9.07
рейтинг книги
Ты не мой Boy 2
6. Самбисты
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Метатель. Книга 2
2. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Право налево
Любовные романы:
современные любовные романы
8.38
рейтинг книги
Имя нам Легион. Том 2
2. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Сумеречный стрелок 8
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сильнейший ученик. Том 2
2. Пробуждение крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последняя Арена 4
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00