[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Открытие терминального файла - Пример: флаг O_NDELAY

Этот пример показывает, как открывается специальный файл, связанный с
вашим терминалом и как производится чтение из него. Ввод должен
производиться в течение определенного периода времени. Например,
автоматическая машина-инспектор требует ввода вашего идентификатора в
течение пяти секунд. Программа работает следующим образом:
   11-15  Открывается специальный  файл,  связанный  с  терминалом,  с
          использованием флага  O_NDELAY. Это  повлияет на последующее
          чтение из  файла. Если  не будет  ввода, то  функции read(2)
          вернется с  нулем байтов.  Если взамен  был использован флаг
          O_NONBLOCK, то read(2) вернет -1 и установит errno в EAGAIN.

          Замечание:   /dev/tty   отображается   на   ваше   подлинное
          терминальное устройство.  Использование /dev/tty увеличивает
          переносимость  программы,   поэтому  терминал,   с  которого
          осуществляется вход, не надо встраивать в тело программы или
          передавать в командной строке.

          При  открытии   специального  файла,   связанного  с  линией
          коммуникации, open(2)  с флагом  O_NDELAY немедленно  вернет
          файловый дескриптор, не дожидаясь несущей.

   16-21  Пользователь должен  ввести ответ  в  течение  пяти  секунд.
          Программа "заснет"  на пять  секунд, в течение которых ответ
          должен быть  введен.  Ввод  завершается  нажатием  <RETURN>.
          Данные хранятся  в буфере  до тех  пор,  пока  программа  не
          произвела их  чтение. Если  ввода  не  произошло,  программа
          просыпается,  ничего  не  может  прочесть  и  завершается  с
          сообщением. Это  иллюстрирует  возможность  предварительного
          ввода с терминала.

23-25     fcntl(2) используется для получения и модификации флагов
состояния файла. Флаг O_NDELAY отключается, так что терминал будет
ждать, пока ввод не будет завершен нажатием клавиши <RETURN>.
26-27     После печати сообщения программа ожидает ввода.
Нет возможности отличить состояние отсутствия ввода от конца ввода при
использовании флага O_NDELAY. В обоих случаях read(2) вернет нуль. В
этом случае можно использовать O_NONBLOCK и анализировать errno.
Файл: opentty.c
                ОТКРЫТИЕ ТЕРМИНАЛЬНОГО ФАЙЛА - ПРИМЕР
                            ФЛАГ O_NDELAY


 1 #include <stdio.h>
 2 #include <fcntl.h>
 3 #include <unistd.h>
 4 #include <stdlib.h>
 5
 6 main()
 7 {
 8     int fd, flags;
 9     char line[BUFSIZ];
10
11     if ((fd = open("/dev/tty", O_RDONLY |
12     O_NDELAY)) == -1) {
13     perror("/dev/tty");
14     exit(2);
15     }
16     printf("Enter your PIN within five seconds:\n> ");
17     sleep(5);
18     if (read(fd, line, BUFSIZ) == 0) {
19     printf("\nSorry\n");
20     exit(1);
21     }
22
23     flags = fcntl(fd, F_GETFL);
24     flags &= ~O_NDELAY;      /* turn off delay flag */
25     fcntl(fd, F_SETFL, flags);
26     printf("Enter your bank account number:\n> ");
27     read(fd, line, BUFSIZ);
28
29     /*
30      * .... data processing is performed here ....
31      */
32 }