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

на главную

Жанры

Основы программирования в Linux
Шрифт:

К счастью, Linux и UNIX облегчают жизнь, предоставляя специальное устройство /dev/tty, которое всегда является текущим терминалом или сеансом работы в системе (login session). Поскольку ОС Linux все интерпретирует как файлы, вы можете выполнять обычные файловые операции для чтения с устройства /dev/tty и записи на него.

В упражнении 5.3 вы исправите программу выбора пункта меню так, чтобы можно было передавать параметры в подпрограмму

getchoice
и благодаря этому лучше управлять выводом. Назовите ее menu3.c.

Упражнение 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), разделяя их на применяемые для чтения и для записи. Такой подход сохраняет ясность интерфейса данных (чтение/запись), позволяя при этом искусно управлять поведением терминала. Нельзя сказать, что терминальный интерфейс ввода/вывода очень понятен — он вынужден иметь дело с множеством разнообразных физических устройств.

Поделиться:
Популярные книги

Хозяин оков VI

Матисов Павел
6. Хозяин Оков
Фантастика:
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Хозяин оков VI

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Золото Советского Союза: назад в 1975. Книга 2

Майоров Сергей
2. Золото Советского Союза
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Золото Советского Союза: назад в 1975. Книга 2

Орден Архитекторов 12

Винокуров Юрий
12. Орден Архитекторов
Фантастика:
фэнтези
5.00
рейтинг книги
Орден Архитекторов 12

Я все еще барон

Дрейк Сириус
4. Дорогой барон!
Фантастика:
боевая фантастика
5.00
рейтинг книги
Я все еще барон

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода

Телохранитель Генсека. Том 1

Алмазный Петр
1. Медведев
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Телохранитель Генсека. Том 1

Моя простая курортная жизнь

Блум М.
1. Моя простая курортная жизнь
Проза:
современная проза
5.00
рейтинг книги
Моя простая курортная жизнь

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Локки 9. Потомок бога

Решетов Евгений Валерьевич
9. Локки
Фантастика:
фэнтези
попаданцы
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 9. Потомок бога