Читаем Linux API. Исчерпывающее руководство полностью

Листинг 58.3. Переключение терминала между режимом без обработки и cbreak

tty/tty_functions.c

#include

#include

#include "tty_functions.h" /* Объявляет определяемые здесь функции */


/* Переводим терминал, на который ссылается 'fd', в режим cbreak

(неканонический, с выключенным эхо-контролем). Мы исходим из того,

что терминал пребывает в режиме с обработкой (то есть мы не должны

вызывать эту функцию, если терминал находится в режиме без обработки,

так как она не сбрасывает все изменения, вносимые функцией ttySetRaw(),

приведенной ниже). Возвращает 0 при успешном завершении или -1 в случае

ошибки. Если аргумент 'prevTermios' не равен NULL, то должен указывать

на буфер с предыдущими параметрами терминала. */


int

ttySetCbreak(int fd, struct termios *prevTermios)

{

struct termios t;


if (tcgetattr(fd, &t) == -1)

return -1;


if (prevTermios!= NULL)

*prevTermios = t;


t. c_lflag &= ~(ICANON | ECHO);

t. c_lflag |= ISIG;

t. c_iflag &= ~ICRNL;

t. c_cc[VMIN] = 1; /* Посимвольный ввод */

t. c_cc[VTIME] = 0; /* с блокировкой */

if (tcsetattr(fd, TCSAFLUSH, &t) == -1)

return -1;


return 0;

}


/* Переводим терминал, на который ссылается 'fd', в режим без обработки

(неканонический режим с отключением любой обработки ввода и вывода).

Возвращает 0 при успешном завершении или -1 в случае ошибки. Если

аргумент 'prevTermios' не равен NULL, он должен указывать на буфер

с предыдущими параметрами терминала. */


int

ttySetRaw(int fd, struct termios *prevTermios)

{

struct termios t;


if (tcgetattr(fd, &t) == -1)

return -1;


if (prevTermios!= NULL)

*prevTermios = t;


t. c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO);

/* Неканонический режим, отключаем сигналы,

расширенную обработку ввода и эхо-контроль */


t. c_iflag &= ~(BRKINT | ICRNL | IGNBRK | IGNCR | INLCR |

INPCK | ISTRIP | IXON | PARMRK);

/* Отключаем интерпретацию символов CR, NL и BREAK. Урезание до 8 бит

и проверка на ошибки соответствия отсутствуют. Отключаем управление

потоком с помощью символов START/STOP. */


t. c_oflag &= ~OPOST; /* Полностью отключаем обработку вывода */

t. c_cc[VMIN] = 1; /* Посимвольный ввод */

t. c_cc[VTIME] = 0; /* с блокировкой */


if (tcsetattr(fd, TCSAFLUSH, &t) == -1)

return -1;

return 0;

}

tty/tty_functions.c

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

Пример того, как это делается, показан в листинге 58.4. Данная программа выполняет следующие шаги.

• Переключает терминал либо в режим cbreak , либо в режим без обработки в зависимости от наличия аргумента командной строки (которым может быть любой набор символов) . Предыдущие параметры терминала сохраняются в глобальной переменной userTermios .

• Если терминал был помещен в режим cbreak, то из него могут генерироваться сигналы. Их нужно обрабатывать, чтобы в случае приостановки или завершения программы терминал был возвращен в нормальный режим, привычный для пользователя. Программа устанавливает один и тот же обработчик для сигналов SIGQUIT и SIGINT . Сигнал SIGTSTP требует особого обращения, поэтому для него предусмотрен отдельный обработчик .

• Устанавливает обработчик для сигнала SIGTERM, который по умолчанию генерируется командой kill .

• Входит в цикл, посимвольно считывающий стандартный ввод, и направляет его в стандартный вывод . Прежде чем выводить различные входящие символы, программа их интерпретирует :

• перед выводом все буквы переводятся в нижний регистр;

• символы новой строки (\n) и разрыва строки (\r) экранируются без изменений;

• управляющие символы, кроме \n и \r, экранируются в виде последовательностей из двух символов: знака ^ и соответствующей буквы в верхнем регистре (например, Ctrl+A выводится как ^A);

• остальные символы экранируются в виде звездочек (*);

• буква q приводит к завершению цикла .

• При выходе из цикла программа восстанавливает состояние терминала, установленное пользователем ранее, и завершает свою работу .

Программа устанавливает для сигналов SIGQUIT, SIGINT и SIGTERM один и тот же обработчик, который возвращает терминал в предыдущее состояние, и завершает работу .

Обработчик сигнала SIGTSTP ведет себя так, как было описано в подразделе 34.7.3. Ниже приведена часть особенностей его работы.

• Во время ввода он сохраняет текущие параметры терминала (в переменной ourTermios) , после чего возвращает терминал к состоянию, актуальному на момент запуска программы (сохраненному в переменной userTermios) , и генерирует еще один сигнал SIGTSTP, чтобы на самом деле остановить процесс.

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

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

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных