Чтение онлайн

ЖАНРЫ

Основы программирования в Linux
Шрифт:
Упражнение 5.3. Применение /dev/tty

Загрузите файл menu2.c и измените программный код так, чтобы входные и выходные данные приходили с устройства /dev/tty и направлялись на это устройство.

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

char *menu[] = {

 "a — add new record", "d — delete record", "q - quit", NULL,

};

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

int main {

 int choice = 0;

 FILE* input;

 FILE* output;

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

fprintf(stderr, "You are not a terminal, OK.\n");

 }

 input = fopen("/dev/tty", "r");

 output = fopen("/dev/tty", "w");

 if (!input || !output) {

fprintf(stderr, "Unable to open /dev/tty\n");

exit(1);

 }

 do {

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

printf("You have chosen: %c\n", choice);

 } while (choice != 'q');

 exit(0);

}

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

 int chosen = 0;

 int selected;

 char **option;

 do {

fprintf(out, "Choice: %s\n", greet);

option = choices;

while (*option) {

fprintf(out, "%s\n", *option);

option++;

}

do {

selected = fgetc(in);

} while(selected == '\n');

option = choices;

while (*option) {

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

chosen = 1;

break;

}

option++;

}

if (!chosen) {

fprintf(out, "Incorrect choice, select again\n");

}

 } while (!chosen);

 return selected;

}

Теперь,

когда вы выполните программу с перенаправленным выводом, вы сможете увидеть строки приглашения, а стандартный вывод программы (обозначающий выбранные пункты меню) перенаправляется в файл, который можно просмотреть позже:

$ ./menu3 > file

You are not a terminal, OK.

Choice: Please select an action

a — add new record

d — delete record

q — quit

d

Choice: Please select an action

a — add new record

d - delete record

q — quit

q

$ cat file

You have chosen: d

You have chosen: q

Драйвер терминала A и общий терминальный интерфейс

Иногда программе нужно более мощные средства управления терминалами, чем простые файловые операции. ОС Linux предоставляет ряд интерфейсов, позволяющих управлять поведением драйвера терминала и обеспечивающих больше возможностей управления вводом и выводом терминала.

Обзор

Как показано на рис. 5.1, вы можете управлять терминалом с помощью вызовов набора функций общего терминального интерфейса (General Terminal Interface, GTI), разделяя их на применяемые для чтения и для записи. Такой подход сохраняет ясность интерфейса данных (чтение/запись), позволяя при этом искусно управлять поведением терминала. Нельзя сказать, что терминальный интерфейс ввода/вывода очень понятен — он вынужден иметь дело с множеством разнообразных физических устройств.

Рис. 5.1 

В терминологии UNIX управляющий интерфейс устанавливает "порядок обслуживания линий", обеспечивающий программе ощутимую гибкость в задании поведения драйвера терминала.

К основным функциям, которыми вы можете управлять, относятся следующие:

редактирование строки — применение для редактирования клавиши <Backspace>;

буферизация — считывание символов сразу или после настраиваемой задержки;

отображение — управление отображением так же, как при считывании паролей;

CR/LF — отображение для ввода и вывода: что происходит при выводе символа перевода строки (\n);

скорости передачи данных по линии — редко применяется для консоли ПК, эти скорости очень важны для модемов и терминалов на линиях последовательной передачи.

Аппаратная модель

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

Поделиться с друзьями: