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

58.8. Управление последовательным портом


Функции tcsendbreak(), tcdrain(), tcflush() и tcflow() выполняют действия, которые можно объединить под общим названием управление последовательным портом (они были разработаны для стандарта POSIX, чтобы заменить различные операции с вызовом ioctl()).

#include


int tcsendbreak(int fd, int duration);

int tcdrain(int fd);

int tcflush(int fd, int queue_selector);

int tcflow(int fd, int action);

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

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

Функция tcsendbreak() генерирует условие BREAK, безостановочно передавая поток нулевых битов. Аргумент duration обозначает длину передачи. Допустим, он равен 0, тогда нулевые биты будут передаваться на протяжении 0,25 секунды (стандарт SUSv3 ограничивает продолжительность в пределах от 0,25 до 0,5 секунды). Если duration больше 0, то нулевые биты станут передаваться на протяжении заданного количества миллисекунд. Этот случай не предусмотрен стандартом SUSv3; обработка ненулевых значений duration сильно варьируется в зависимости от реализации (детали, описанные здесь, актуальны для библиотеки glibc).

Функция tcdrain() блокируется, пока не будет передан весь вывод (то есть пока не опустеет исходящая очередь терминала).

Функция tcflush() сбрасывает (отклоняет) данные во входящей и/или исходящей очереди терминала (см. рис. 58.1). Сброс входящей очереди приводит к потере данных, которые уже дошли до драйвера терминала, но еще не были прочитаны ни одним процессом. Например, приложение может использовать tcflush() для отмены всех запоздалых символов, прежде чем предложить ввести пароль. Сброс исходящей очереди отклоняет все данные, которые уже были записаны (переданы драйверу терминала), но еще не переданы устройству. Аргумент queue_selector может принимать одно из значений, описанных в табл. 58.4.

Стоит отметить, что термин «сброс» в контексте функции tcflush() имеет другое значение, чем в случае с файловым вводом/выводом. При работе с файлами «сбросить» означает принудительно записать вывод в пользовательский сегмент памяти или буферный кэш (если речь идет о вызове fflush()) либо же переместить данные из буферного кэша на диск, как при использовании вызовов fsync(), fdatasync() и sync().


Таблица 58.4. Значения аргумента queue_selector для функции tcflush()

Значение — Описание

TCIFLUSH — Сбрасывает входящую очередь

TCOFLUSH — Сбрасывает исходящую очередь

TCIOFLUSH — Сбрасывает входящую и исходящую очереди


Функция tcflow() управляет потоком данных, передающихся между компьютером и терминалом (или другим удаленным устройством) в любом направлении. Аргумент action принимает одно из значений, перечисленных в табл. 58.5. Константы TCIOFF и TCION действуют только в терминалах, способных интерпретировать символы STOP и START; они приводят к приостановке и, соответственно, возобновлению передачи данных компьютеру.


Таблица 58.5. Значения аргумента action для функции tcflush()

Значение — Описание

TCOOFF — Приостанавливает вывод в терминал

TCOON — Возобновляет вывод в терминал

TCIOFF — Передает терминалу символ STOP

TCION — Передает терминалу символ START


58.9. Размер окна терминала


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

• После изменения размера окна терминала активной группе процессов отправляется сигнал SIGWINCH. По умолчанию он игнорируется.

• В любой момент (обычно после получения сигнала SIGWINCH) процесс может использовать вызов ioctl() с флагом TIOCGWINSZ, чтобы получить текущий размер окна терминала.

Вызов ioctl() с флагом TIOCGWINSZ применяется следующим образом:

if (ioctl(fd, TIOCGWINSZ, &ws) == -1)

errExit("ioctl");

Аргумент fd является файловым дескриптором, ссылающимся на окно терминала. Последний аргумент вызова ioctl() представляет собой указатель на структуру winsize (определена в заголовочном файле ), которая используется для возвращения размера окна терминала:

struct winsize {

unsigned short ws_row; /* Количество строк (в символах) */

unsigned short ws_col; /* Количество столбцов (в символах) */

unsigned short ws_xpixel; /* Ширина (в пикселах) */

unsigned short ws_ypixel; /* Высота (в пикселах) */

};

Как и многие другие системы, Linux не задействует поля структуры winsize с пиксельными размерами.

Использование сигнала SIGWINCH в сочетании с операцией ioctl() TIOCGWINSZ демонстрируется в листинге 58.5. Ниже показан пример того, что можно увидеть при запуске этой программы в среде с оконным менеджером и изменении размера окна терминала три раза подряд:

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

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

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#.Введите сюда краткую аннотацию

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

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