Архитектура операционной системы UNIX   ::   Бах Морис Дж.

Страница: 541 из 715

c_cc[VTIME] = 100; /* интервал 10 секунд */

 if (ioctl(0,TCSETAF, &newtty) == -1) {

  printf("не могу перевести тер-л в режим без обработки\n");

  exit();

 }

 for(;;) {

  nrd = read(0, buf, sizeof(buf));

  buf[nrd] = 0;

  printf("чтение %d символов %s'\n", nrd, buf);

 }

}

sigcatch() {

 ioctl(0, TCSETAF, &savetty);

 exit();

}

Рисунок 10.17. Режим без обработки — чтение 5-символьных блоков



10.3.4 Опрос терминала



Иногда удобно производить опрос устройства, то есть считывать с него данные, если они есть, или продолжать выполнять обычную работу — в противном случае. Программа на Рисунке 10.18 иллюстрирует этот случай: после открытия терминала с параметром "no delay" (без задержки) процессы, ведущие чтение с него, не приостановят свое выполнение в случае отсутствия данных, а вернут управление немедленно (см. алгоритм terminal_read, Рисунок 10.15). Этот метод работает также, если процесс следит за множеством устройств: он может открыть каждое устройство с параметром "no delay" и опросить всех из них, ожидая поступления информации с каждого. Однако, этот метод растрачивает вычислительные мощности системы.

#include ‹fcntl.h›

main() {

 register int i, n;

 int fd;

 char buf[256] ;

 /* открытие терминала только для чтения с опцией "no delay" */

 if ((fd = open("/dev/tty", O_RDONLYO_NDELAY)) == -1) exit();

 n = 1;

 for(;;) {  /* всегда */

  for (i = 0; i ‹ n; i++);

  if (read(fd, buf, sizeof(buf)) › 0) {

   printf("чтение с номера %d\n", n);

   n--;

  }

  else n++; /* ничего не прочитано; возврат вследствие "no delay" */

 }

}

Рисунок 10.18. Опрос терминала

В системе BSD есть системная функция select, позволяющая производить опрос устройства.

|< Пред. 539 540 541 542 543 След. >|

Java книги

Контакты: [email protected]