русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Запирание терминала - пример


Дата добавления: 2013-12-23; просмотров: 691; Нарушение авторских прав


 

Эта программа запирает терминал пользователя. Она запрашивает пользователя ввести «ключ». Конечно, пользователю было бы удобнее, чтобы ключ совпадал с его паролем, но в современных Unix-системах хэши паролей доступны только пользователю root, поэтому ключ необходимо вводить при запуске программы. Эхо выключено, поэтому ключ не будет показан на терминале. Этот же ключ должен быть введен, чтобы получить доступ к терминалу. Программа работает так:

9 Объявляет структуру termios для сохранения установок терминала.

10 Объявляет переменную tcflag_t для сохранения текущих значений c_lflag.

11 Объявляет массив символов для сохранения значения первого ключа. Ключ может быть очень длинным, так как BUFSIZ имеет большое значение.

13 Программа получает текущие установки терминала. Первый параметр - дескриптор файла стандартного ввода, полученный макросом fileno, определенным в <stdio.h>. Если stdin переназначен, то программа работать не будет. Второй аргумент - адрес структуры termios.

14 Сохраняется значение поля c_lflag. Это значение затем будет использовано для восста­новления состояния терминального интерфейса.

15-16 Запрещается сравнение ввода с управляющими символами INTR, QUIT, SUSP и DSUSP. Эхо выключается. tcsetattr(3C) вызывается с флагом 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);

7 main() /* lock the terminal */

8 {

9 struct termios tty;

10 tcflag_t savflags;

11 char key[BUFSIZ];

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 }

28 static char *getkey(void) /* prompt user for key */

29 {

30 static char line[BUFSIZ];

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 }

 



<== предыдущая лекция | следующая лекция ==>
Некоторые флаги режимов | Неканонический ввод


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.377 сек.