Читаем Архитектура операционной системы UNIX полностью

На Рисунке 10.17 приведена программа, использующая функцию ioctl для сохранения текущих установок терминала для файла с дескриптором 0, что соответствует значению дескриптора файла стандартного ввода. Функция ioctl с командой TCGETA приказывает драйверу извлечь установки и сохранить их в структуре с именем savetty в адресном пространстве задачи. Эта команда часто используется для того, чтобы определить, является ли файл терминалом или нет, поскольку она ничего не изменяет в системе: если она завершается неудачно, процессы предполагают, что файл не является терминалом. Здесь же, процесс вторично вызывает функцию ioctl для того, чтобы перевести терминал в режим без обработки: он отключает эхо-сопровождение ввода символов и готовится к выполнению операций чтения с терминала по получении с терминала 5 символов, как минимум, или по прохождении 10 секунд с момента ввода первой порции символов. Когда процесс получает сигнал о прерывании, он сбрасывает первоначальные параметры терминала и завершается.

#include ‹signal.h›

#include ‹termio.h›

struct termio savetty;

main {

 extern sigcatch;

 struct termio newtty;

 int nrd;

 char buf[32];

 signal(SIGINT, sigcatch);

 if (ioctl(0, TCGETA, &savetty) == -1) {

  printf("ioctl завершилась неудачно: нет терминала\n");

  exit;

 }

 newtty = savetty;

 newtty.c_lflag &= ~ICANON; /* выход из канонического режима */

 newtty.c_lflag &= ~ECHO; /* отключение эхо-сопровождения*/

 newtty.c_cc[VMIN] = 5; /* минимум 5 символов */

 newtty.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-символьных блоков

<p id="_11_3_4">10.3.4 Опрос терминала</p>

Иногда удобно производить опрос устройства, то есть считывать с него данные, если они есть, или продолжать выполнять обычную работу — в противном случае. Программа на Рисунке 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, позволяющая производить опрос устройства. Синтаксис вызова этой функции:

select(nfds, rfds, wfds, efds, timeout)

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

Похожие книги

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

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT