[<<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 }