Kniga-Online.club
» » » » Основы программирования в Linux - Мэтью Нейл

Основы программирования в Linux - Мэтью Нейл

Читать бесплатно Основы программирования в Linux - Мэтью Нейл. Жанр: Интернет год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Для установки атрибутов применяется действие TCSAFLUSH для очистки буфера клавиатуры, символов, которые пользователи вводили до того, как программа подготовилась к их считыванию. Это хороший способ заставить пользователей не начинать ввод своего пароля, пока не отключено отображение. Перед завершением программы вы также восстанавливаете первоначальные установки.

Другой распространенный пример использования структуры termios — перевод терминала в состояние, позволяющее вам считывать каждый набранный символ (упражнение 5.5). Для этого отключается канонический режим и используются параметры MIN и TIME.

Упражнение 5.5. Считывание каждого символа

Применяя только что полученные знания, вы можете изменить программу menu. Приведенная далее программа menu4.c базируется на программе menu3.c и использует большую часть кода из файла password.с, включенного в нее. Внесенные изменения выделены цветом и объясняются в пунктах описания.

1. Прежде всего, вам следует, включить новый заголовочный файл в начало программы:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

<i>#include &lt;termios.h&gt;</i>

char *menu[] = {

 &quot;a — add new record&quot;,

 &quot;d — delete record&quot;,

 &quot;q - quit&quot;,

 NULL,

};

2. Затем нужно объявить пару новых переменных в функции main:

int getchoice(char *greet, char *choices[], FILE *in, FILE *out);

int main() {

 int choice = 0;

 FILE *input;

 FILE *output;

<i> struct termios initial_settengs, new_settings;</i>

3. Перед вызовом функции getchoice вам следует изменить характеристики терминала, этим определяется место следующих строк:

 if (!isatty(fileno(stdout))) {

  fprintf(stderr, &quot;You are not a terminal, OK.n&quot;);

 }

 input = fopen(&quot;/dev/tty&quot;, &quot;r&quot;);

 output = fopen(&quot;/dev/tty&quot;, &quot;w&quot;);

 if (!input || !output) {

  fprintf(stderr, &quot;Unable to open /dev/ttyn&quot;);

  exit(1);

 }

<i> tcgetattr(fileno(input), &amp;initial_settings);</i>

<i> new_settings = initial_settings;</i>

<i> new_settings.c_lfag &amp;= ~ICANON;</i>

<i> new_settings.c_lflag &amp;= ~ECHO;</i>

<i> new_settings.c_cc[VMIN] = 1;</i>

<i> new_settings.c_cc[VTIME] = 0;</i>

<i> new_settings.c_lflag &amp;= ~ISIG;</i>

<i> if (tcsetattr(fileno(input), TCSANOW, &amp;new_settings) != 0) {</i>

<i>  fprintf(stderr, &quot;could not set attributesn&quot;);</i>

<i> }</i>

4. Перед завершением вы также должны вернуть первоначальные значения:

 do {

  choice = getchoice(&quot;Please select an action&quot;, menu, input, output);

  printf(&quot;You have chosen: %cn&quot;, choice);

 } while (choice != 'q');

 tcsetattr(fileno(input), TCSANOW, &amp;initial_settings);

 exit(0);

}

5. Теперь, когда вы в неканоническом режиме, необходимо проверить на соответствие возвраты каретки, поскольку стандартное преобразование CR (возврат каретки) в LF (переход на новую строку) больше не выполняется:

int getchoice (char *greet, char *choices[], FILE *in, FILE *out) {

 int chosen = 0;

 int selected;

 char **option;

 do {

  fprintf(out, &quot;Choice: %sn&quot;, greet);

  option = choices;

  while (*option) {

   fprintf(but, &quot;%sn&quot;, *option);

   option++;

  }

  do {

   selected = fgetc(in);

<i>  } while (selected == 'n' || selected == 'r');</i>

  option = choices;

  while (*option) {

   if (selected == *option[0]) {

    chosen = 1;

    break;

   }

   option++;

  }

  if (!chosen) {

   fprintf(out, &quot;Incorrect choice, select againn&quot;);

  }

 } while(!chosen);

 return selected;

}

Пока вы не устроите все иначе, теперь, если пользователь нажмет в вашей программе комбинацию клавиш <Ctrl>+<C>, программа завершится. Вы можете отключить обработку этих специальных символов, очистив флаг ISIG в локальных режимах. Для этого в функцию main включается следующая строка:

<i>new_settings.c_lflag &amp;= ~ISIG;</i>

Если вы внесете эти изменения в вашу программу меню, то будете получать немедленный отклик, и вводимый вами символ не будет отображаться на экране.

Перейти на страницу:

Мэтью Нейл читать все книги автора по порядку

Мэтью Нейл - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Основы программирования в Linux отзывы

Отзывы читателей о книге Основы программирования в Linux, автор: Мэтью Нейл. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*