[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Модуль дисциплины линии (ldterm)

Ldterm - это стандартная дисциплина линии для терминалов. Она соответствует стандарту POSIX и совместима с интерфейсом BSD. Последний поддерживается только для обеспечения совместимости с устаревшими приложениями. Для обеспечения переносимости приложений настоятельно рекомендуется разрабатывать новые приложения на основе стандарта POSIX.

В этом разделе описаны возможности протокола ldterm. Дополнительная информация о работе с ldterm приведена в разделе "termios.h File" руководства AIX 5L Version 5.1 Files Reference

Дополнительные сведения о дисциплине линии ldterm можно найти в следующих разделах:

Параметры терминала

Параметры ввода-вывода различных терминалов задаются в структуре termios, описанной в файле termios.h. Ниже перечислены некоторые (но не все) элементы структуры termios:

tcflag_t c_iflag Режимы ввода
tcflag_t c_oflag Режимы вывода
tcflag_t c_cflag Режимы управления
tcflag_t c_lflag Режимы локали
cc_t c_cc[NCCS] Управляющие символы.

В файле termios.h определены целочисленные типы без знака tcflag_t и cc_t, а также символ NCCS.

Управление группами процессов в рамках сеанса (управление заданиями)

Управляющий терминал выделяет одну группу процессов в рамках сеанса, с которым он связан, и объявляет ее основной (интерактивной) группой процессов. Все остальные группы процессов данного сеанса объявляются фоновыми. Основная группа процессов играет особую роль при обработке сигналов.

Процессы интерпретации команд с поддержкой управления заданиями, например, оболочка Korn (команда ksh) и оболочка C (команда csh), могут выделить терминал нескольким заданиям, или группам процессов, путем объединения этих процессов в одну группу и назначения терминала этой группе. Процесс может установить или опросить основную группу процессов терминала, если у этого процесса есть соответствующие права доступа. Драйвер терминала содействует разбиению заданий на группы, запрещая доступ к терминалу процессам, не входящим в основную группу.

Управление доступом к терминалу

Если процесс, не входящий в основную группу управляющего терминала, пытается считать данные с терминала, то в группу этого процесса передается сигнал SIGTTIN. Если же данный процесс игнорирует или блокирует сигнал SIGTTIN или если группа этого процесса недоступна, то запрос на чтение возвращает код -1, присваивает глобальной переменной errno значение EIO и не передает сигнал.

Если процесс, не входящий в основную группу управляющего терминала, пытается записать данные на терминал, то в группу этого процесса передается сигнал SIGTTOU. Однако управление сигналом SIGTTOU зависит от флага TOSTOP, определенного в поле c_lflag структуры termios. Если флаг TOSTOP сброшен, а также если флаг TOSTOP установлен, но процесс игнорирует или блокирует сигнал SIGTTOU, этому процессу разрешается запись на терминал, а сигнал SIGTTOU не передается. Если флаг TOSTOP установлен, группа процесса, запросившего запись, недоступна, а процесс не игнорирует и не блокирует сигнал SIGTTOU, то запрос на запись возвращает код -1, присваивает глобальной переменной errno значение EIO и не передает сигнал.

Некоторые функции, устанавливающие параметры терминала ( tcsetattr, tcsendbreak, tcflow и tcflush), обрабатываются так же, как и запросы на запись, за исключением того, что флаг TOSTOP игнорируется. Иными словами, они обрабатываются так же, как и запросы на запись при установленном флаге TOSTOP.

Чтение данных и обработка ввода

На терминалы, работающие в дуплексном режиме, данные могут поступать даже во время вывода. С каждым файлом устройства для терминала связана очередь ввода, в которой система хранит поступающие данные до тех пор, пока они не будут считаны соответствующим процессом. Максимальное число байтов в очереди ввода ограничено константой MAX_INPUT в файле заголовка limits.h. Если очередь достигает максимального размера, ее содержимое полностью удаляется без какого-либо уведомления.

Существует два основных типа обработки ввода. Выбор конкретного типа определяется тем, находится ли файл устройства для терминала в стандартном или же в нестандартном режиме. Кроме того, при обработке вводимых символов учитываются значения полей c_iflag и c_lflag. В ходе обработки возможен эхоповтор, т.е. введенные символы могут немедленно передаваться обратно на терминал, с которого они поступили. Эхоповтор полезен при работе в дуплексном режиме.

Запрос на чтение может обрабатываться одним из двух способов в зависимости от того, установила ли функция open или fcntl флаг O_NONBLOCK. Если флаг O_NONBLOCK сброшен, то запрос на чтение блокируется до тех пор, пока данные не станут доступными или не будет получен сигнал. Если флаг O_NONBLOCK установлен, то запрос на чтение будет выполнен одним из трех способов:

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

Обработка ввода в стандартном режиме

В стандартном режиме обработки ввода (в поле c_lflag структуры termios установлен флаг ICANON) ввод с терминала обрабатывается построчно. Ограничителем строки считается любой из следующих символов: символ начала строки (ASCII LF), символ конца файла (EOF) или символ конца строки (EOL). Это означает, что программа, отправившая запрос на чтение, блокируется до тех пор, пока не будет напечатана целая строка или пока не поступит сигнал. Кроме того, запрос на чтение возвращает не более одной строки, независимо от того, сколько символов было указано в запросе. Однако необязательно считывать только целые строки. В запросе на чтение может быть указано любое число символов, и потери информации не произойдет. Обработка символов удаления выполняется в ходе ввода.

Символ удаления символа (ERASE) Удаляет последний введенный символ (по умолчанию - клавиша Backspace).
Символ удаления слова (WERASE) Удаляет последнее слово, введенное в текущей строке, но оставляет предшествующие этому слову пробелы и символы табуляции (по умолчанию - комбинация клавиш Ctrl-W).

(Словом считается последовательность символов, не содержащая пробелов и символов табуляции.) Ни ERASE, ни WERASE не удаляют символы из предыдущих строк.

Символ удаления строки (KILL) Удаляет всю введенную строку и (необязательно) печатает символ начала строки (по умолчанию - комбинация клавиш Ctrl-U).

Все эти символы обрабатываются по нажатии клавиш, причем независимо от нажатий клавиш Backspace и Tab.

Символ REPRINT Печатает символ начала строки, а затем те символы из предыдущей строки, которые не были считаны (по умолчанию - комбинация клавиш Ctrl-R).

Повторная печать выполняется также автоматически, если символы, которые в обычных условиях были бы удалены с экрана, были выведены на него программно. Повторная печать символов выполняется так же, как эхоповтор. Следовательно, если флаг ECHO в поле c_lflag структуры termios сброшен, повторная печать не выполняется. Для ввода символов ERASE и KILL следует поставить перед ними символ \ (обратная косая черта): в этом случае сам символ \ не будет обрабатываться. Символы ERASE, WERASE и KILL можно переопределять.

Обработка ввода в нестандартном режиме

В нестандартном режиме обработки ввода (в поле c_lflag структуры termios установлен флаг -ICANON), вводимые байты не разбиваются на строки, а символы удаления слов и строк игнорируются.

MIN Минимальное число байт, которые необходимо принять для того, чтобы запрос на чтение был обработан успешно
TIME Таймер с шагом 0,1 с, применяемый для отсчета тайм-аута и при передаче данных короткими порциями

Значения элементов MIN и TIME массива c_cc определяют способ обработки принятых данных. Значения MIN и TIME можно установить с помощью команды stty. Если значение MIN превышает значение, указанное при определении константы MAX_INPUT, то обработка запроса зависит от реализации. Четыре возможных значения параметров MIN и TIME и их сочетания описаны в следующих разделах.

Вариант A: MIN 0, TIME 0

В этом случае TIME задает интервал приема следующего байта: таймер активизируется после приема первого байта и сбрасывается при приеме каждого следующего байта. Если до срабатывания таймера считано MIN байт, то обработка запроса на чтение завершается успешно. Если до срабатывания таймера принято меньше MIN байт, пользователю передаются все символы, принятые до этого момента. Если операция чтения была прервана по таймеру, то будет возвращен хотя бы один байт. (Если ни одного байта не принято, то таймер не активизируется.) Операция чтения блокируется до активизации механизмов MIN и TIME после приема первого байта или же до приема сигнала.

Вариант B: MIN 0, TIME = 0

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

Вариант C: MIN = 0, TIME 0

В этом случае, так как значение MIN равно 0, TIME не может задавать интервал приема следующего байта. В данном случае это значение задает интервал приема всех данных. Таймер включается в момент начала обработки запроса. Обработка запроса на чтение завершается успешно после приема одного байта или после срабатывания таймера. Обратите внимание, что если таймер сработал, не будет возвращено ни одного байта. Если таймер не сработал, обработка запроса может завершиться успешно только в случае, если байт будет принят. Таким образом, применение этой схемы позволяет избежать "зависания" программы на неограниченное время в ожидании одного байта. Если после начала обработки запроса на чтение в течение TIME * 0,1 секунды не было принято ни одного байта, запрос на чтение возвращает значение 0 - данные не считаны.

Вариант D: MIN = 0, TIME = 0

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

Случаи А и В подходят для обработки запросов на серийное чтение данных, например, от программ передачи файлов, если для работы программа должна за один запрос получить некоторое минимальное число символов. Это число указывается в переменной MIN. В случае А для обеспечения надежности включается таймер, в случае В он выключен.

Случаи C и D подходят для обработки ограниченной посимвольной передачи данных. Они применяются при работе с приложениями вывода данных на экран, которым нужно знать, содержался ли в очереди ввода хотя бы один символ, перед обновлением экрана. В случае С устанавливается таймер, в случае D он выключен. Случай D отличается более низкой производительностью, но его следует предпочесть запросам на чтение с установкой флага O_NONBLOCK.

Запись данных и обработка вывода

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

Управление модемом

Если в поле c_cflag структуры termios установлен флаг CLOCAL, то соединение не зависит от содержимого строк состояния модема. Если же флаг CLOCAL сброшен, то выполняется анализ строк состояния модема. В обычной ситуации функция open ожидает установки соединения с модемом. Если же установлен флаг O_NONBLOCK или CLOCAL, то возврат из функции open выполняется немедленно, без ожидания установки соединения.

Если флаг CLOCAL не установлен в поле c_cflag структуры termios, и интерфейс терминала обнаружил разрыв соединения модема с управляющим терминалом, то управляющему процессу, связанному с терминалом, отправляется сигнал SIGHUP. Если реакция на этот сигнал не была изменена, он вызывает завершение процесса. Если сигнал SIGHUP игнорируется или перехватывается, то в ответ на все последующие запросы на чтение вплоть до закрытия терминала передается индикатор конца файла. Все эти запросы на чтение возвращают код -1 и присваивают глобальной переменной errno значение EIO вплоть до закрытия устройства.

Закрытие файла устройства для терминала

Последний процесс, закрывающий файл устройства для терминала, отправляет весь вывод в устройство и аннулирует весь ввод. Если установлен флаг HUPCL в поле c_cflag структуры termios и порт связи поддерживает функцию разъединения, терминал выполняет разъединение.

Связанная информация

Обзор подсистемы TTY, Глава 28, Подсистема tty

Файл termios.h


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]