Читаем 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. Ниже показан пример того, что можно увидеть при запуске этой программы в среде с оконным менеджером и изменении размера окна терминала три раза подряд:

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

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

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