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 массива c_cc определяют способ обработки принятых данных. Значения MIN и TIME можно установить с помощью команды stty. Если значение MIN превышает значение, указанное при определении константы MAX_INPUT, то обработка запроса зависит от реализации. Четыре возможных значения параметров MIN и TIME и их сочетания описаны в следующих разделах.
В этом случае TIME задает интервал приема следующего байта: таймер активизируется после приема первого байта и сбрасывается при приеме каждого следующего байта. Если до срабатывания таймера считано MIN байт, то обработка запроса на чтение завершается успешно. Если до срабатывания таймера принято меньше MIN байт, пользователю передаются все символы, принятые до этого момента. Если операция чтения была прервана по таймеру, то будет возвращен хотя бы один байт. (Если ни одного байта не принято, то таймер не активизируется.) Операция чтения блокируется до активизации механизмов MIN и TIME после приема первого байта или же до приема сигнала.
В этом случае существенно только значение MIN, таймер не включается (значение TIME равно 0). Ожидающий запрос на чтение не завершается (блокируется) до получения MIN байт или до приема сигнала. Программа, работающая по такой схеме с терминалом, обрабатывающим записи, может ожидать выполнения запроса на чтение бесконечно долго.
В этом случае, так как значение MIN равно 0, TIME не может задавать интервал приема следующего байта. В данном случае это значение задает интервал приема всех данных. Таймер включается в момент начала обработки запроса. Обработка запроса на чтение завершается успешно после приема одного байта или после срабатывания таймера. Обратите внимание, что если таймер сработал, не будет возвращено ни одного байта. Если таймер не сработал, обработка запроса может завершиться успешно только в случае, если байт будет принят. Таким образом, применение этой схемы позволяет избежать "зависания" программы на неограниченное время в ожидании одного байта. Если после начала обработки запроса на чтение в течение TIME * 0,1 секунды не было принято ни одного байта, запрос на чтение возвращает значение 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