[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Запирание терминала - пример

Эта программа запирает терминал пользователя. Она запрашивает
пользователя ввести "ключ". Эхо выключено, поэтому ключ не будет
показан на терминале. Этот же ключ должен быть введен, чтобы получить
доступ к терминалу. Программа работает так:
   9      Объявляет  структуру   termios  для   сохранения   установок
          терминала.
   10     Объявляет  переменную   tcflag_t  для   сохранения   текущих
          значений c_lflag.
   11     Объявляет массив  символов для  сохранения значения  первого
          ключа. Ключ  может быть  очень длинным, так как BUFSIZ имеет
          большое значение.
   13     Программа  получает   текущие  установки  терминала.  Первый
          параметр -  дескриптор файла  стандартного ввода, полученный
          макросом fileno,  определенным в <stdio.h> Второй аргумент -
          адрес структуры termios.
   14     Сохраняется значение  поля c_lflag. Это значение затем будет
          использовано  для   восстановления  состояния  терминального
          интерфейса.
   15-16  Запрещается сравнение  ввода с  управляющими символами INTR,
          QUIT, SUSP и DSUSP. Эхо выключается. tcsetattr(2) вызывается
          с флагом  TCSAFLUSH для  изменения  состояния  терминального
          интерфейса и сброса всех введенных символов.
   17     Запоминается ключ,  который позднее  будет  использован  для
          отпирания терминала.
   18-25  Для того,  чтобы выйти  из  этого  цикла,  программа  должна
          получить значение, совпадающее со значением исходного ключа.
          Если ключи  совпадают, терминальный интерфейс возвращается в
          исходное  состояние.   Это  не  делается  автоматически  при
          завершении программы. Если программа завершится ненормально,
          терминал может остаться в странном состоянии.
   28     Эта функция возвращает указатель на строку символов, которая
          содержит ключ, введенный пользователем.
   30     Объявляется массив  символов для  сохранения значения ключа.
          Он объявлен  как static,  и указатель  на этот  массив будет
          возвращен функцией.
   32     Выдается приглашение
   33     Первый символ в массиве line[] устанавливается в невозможное
          значение. Для  чего это  нужно?  Ответ:  Если  getkey()  был
          вызван во  второй раз,  и был  введен только  EOF, не  будет
          считано ни  одного символа;  содержимое line[] будет тем же,
          что и  раньше, и  возвращенная строка совпадет со значением,
          полученным от  первого вызова  этой функции,  что совершенно
          неправильно.
34   Строка ввода считывается без эхо. Не делается проверки на
совпадение с управляющими символами, такими как INTR, QUIT и т.д. Эти
символы обрабатываются так же, как обычные.
Файл: termlock.c
                     ЗАПИРАНИЕ ТЕРМИНАЛА - ПРИМЕР
 1 #include <string.h>
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 #include <termios.h>
 5 static char *getkey(void);
 6
 7 main()          /* lock the terminal */
 8 {
 9      struct termios tty;
10      tcflag_t savflags;
11      char key[BUFSIZ];
12
13      tcgetattr(fileno(stdin), &tty);
14      savflags = tty.c_lflag;
15      tty.c_lflag &= ~(ISIG | ECHO);
16      tcsetattr(fileno(stdin), TCSAFLUSH, &tty);
17      strcpy(key, getkey());
18      for (;;) {
19       if (strcmp(key, getkey()) == 0){
20            tty.c_lflag = savflags;
21            tcsetattr(fileno(stdin), TCSAFLUSH, &tty);
22            break;
23       }
24       fprintf(stderr,"incorrect key try again.\n");
25      }
26 }
27
28 static char *getkey(void)     /* prompt user for key */
29 {
30      static char line[BUFSIZ];
31
32      fputs("Key: ", stderr);
33      line[0] = '\377';  /*change first char for EOF to fgets*/
34      fgets(line, BUFSIZ, stdin);
35      fputs("\n", stderr);
36      return(line);
37 }