Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
$ <b>./menu2</b>Choice: Please select an actiona — add new recordd — delete recordq — quit<b>q</b>You have chosen: q $ <b>./menu2 > file</b>You are not a terminal! $Как это работает
В новом фрагменте программного кода функция
isattystdoutstderr$ <b>./menu2 >file 2>file.error</b>$или объединить оба выводных потока в одном файле:
$ <b>./menu2 >file 2>&1</b>$(Если вы не знакомы с перенаправлением вывода, прочтите еще раз главу 2, в которой мы более подробно рассматриваем синтаксические правила, связанные с ним.) В данном случае вам нужно отправить сообщение непосредственно на терминал пользователя.
Диалог с терминалом
Если нужно защитить части вашей программы, взаимодействующие с пользователем, от перенаправления, но разрешить его для других входных и выходных данных, вы должны отделить общение с пользователем от потоков
stdoutstderrК счастью, Linux и UNIX облегчают жизнь, предоставляя специальное устройство /dev/tty, которое всегда является текущим терминалом или сеансом работы в системе (login session). Поскольку ОС Linux все интерпретирует как файлы, вы можете выполнять обычные файловые операции для чтения с устройства /dev/tty и записи на него.
В упражнении 5.3 вы исправите программу выбора пункта меню так, чтобы можно было передавать параметры в подпрограмму
getchoiceЗагрузите файл 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,};<i>int getchoice(char* greet, char* choices[], FILE* in, FILE* out);</i>int main() { int choice = 0;<i> FILE* input;</i><i> FILE* output;</i> if (!isatty(fileno(stdout))) {<i> fprintf(stderr, "You are not a terminal, OK.n");</i> }<i> input = fopen("/dev/tty", "r");</i><i> output = fopen("/dev/tty", "w");</i><i> if (!input || !output) {</i><i> fprintf(stderr, "Unable to open /dev/ttyn");</i><i> exit(1);</i><i> }</i> do {<i> choice = getchoice("Please select an action", menu, input, output);</i> printf("You have chosen: %cn", choice); } while (choice != 'q'); exit(0);}<i>int getchoice(char* greet, char *choices[], FILE* in, FILE *out) {</i> int chosen = 0; int selected; char **option; do {<i> fprintf(out, "Choice: %sn", greet);</i> option = choices; while (*option) {<i> fprintf(out, "%sn", *option);</i> option++; }<i> do {</i><i> selected = fgetc(in);</i><i> } while(selected == 'n');</i> option = choices; while (*option) { if (selected == *option[0]) { chosen = 1; break; } option++; } if (!chosen) {<i> fprintf(out, "Incorrect choice, select againn");</i> } } while (!chosen); return selected;}Теперь, когда вы выполните программу с перенаправленным выводом, вы сможете увидеть строки приглашения, а стандартный вывод программы (обозначающий выбранные пункты меню) перенаправляется в файл, который можно просмотреть позже:
