Управление терминалом (1114938)
Текст из файла
1Управление терминаломТерминалом мы назовём устройство (или программу), которое позволяет пользователювводить символы (обычно с клавиатуры) и видеть символы, выводимые компьютером (обычно на экране). Нас интересуют так называемые алфавитно-цифровые терминалы, то естьустройства, позволяющие вводить и выводить некоторый (достаточно ограниченный) диапазон символов и не поддерживающие графику. Существует очень большое количество видов (моделей) терминалов, начиная от электрической печатающей машинки, подключённой ккомпьютеру, и заканчивая современными X-терминалами.
Некоторые терминалы являютсяпрограммами (например, программа telnet для Windows), которые эмулируют работу некоторой модели аппаратного терминала.Традиционно терминалы подключались к системам по асинхронным последовательнымканалам связи, например, по стандарту RS-232. Хотя сейчас таких терминалов почти не осталось, интерфейс управления терминалами в системах Posix содержит средства управленияпоследовательным портом компьютера, которые имеют мало смысла, например, для сетевого соединения.Работа с терминалом ведётся через открытый файловый дескриптор терминала.
Как правило, этот открытый файловый дескриптор процесс наследует от интерпретатора команднойстроки. И стандартный поток ввода, и стандартный поток вывода у процесса обычно связаныс одним и тем же терминалом.За время существования системы Unix было разработано большое количество различныхтипов терминалов. Как правило, производитель каждой марки машины делал свой тип терминалов, который был несовместим с другими типами. Поскольку к машине, особенно, еслиона включена в компьютерную сеть, может быть одновременно подключено (физически иличерез сеть) несколько различных типов терминалов, система должна уметь работать с различными несовместимыми типами терминалов.
Чтобы определить тип терминала, с которогоработает пользователь, используется переменная окружения TERM. Например, сразу послевхода пользователя в консоль Linux переменная TERM установлена в linux. После запускаX-сервера и вызова эмулятора терминала xterm тип терминала устанавливается в xterm.Ядро операционной системы, если пользователь работает с физическим терминалом, илиэмулятор терминала, если пользователь работает с виртуальным терминалом, специальнымобразом обрабатывает некоторые вводимые пользователем комбинации клавиш. Например,нажатие Ctrl-C вызывает посылку сигнала SIGINT всем процессам основной группы этоготерминала (подробнее об этом можно прочитать в разделе «Управление заданиями»).
Приложение может отменить специальную обработку таких комбинаций клавиш.1.1 Очереди ввода/выводаПоскольку терминал обычно является достаточно медленным устройством (если терминал подсоединён по последовательной линии, типичная скорость связи составляет 9600 или19200 бод), ядро операционной системы дополнительно буферизует ввод и вывод. Эта буферизация не зависит от буферизации высокоуровневых потоков стандартной библиотекиязыка Си.Очередь ввода терминала хранит символы, которые были получены от терминала, но ещёне были прочитаны никаким процессом. Размер очереди ввода терминала определяется макросами MAX_INPUT и _POSIX_MAX_INPUT, определёнными в файле <limits.h>.
Гарантируется, что очередь ввода имеет минимальный размер MAX_INPUT, но на самом деле1очередь может быть больше или даже динамически менять размер. Если включено управление входным потоком (с помощью бита IXOFF режимов ввода), драйвер терминала передаётна терминал символы STOP и START, когда входная очередь переполняется. В противномслучае вводимые символы могут быть потеряны, если они поступают быстрее, чем успеваютобрабатываться. В каноническом режиме ввода все введённые символы остаются в очереди до тех пор, пока не поступит символ перевода строки, поэтому очередь ввода терминаламожет переполниться, когда пользователь вводит слишком длинную строку.Очередь вывода терминала аналогична очереди ввода, но она содержит символы, которые были записаны на терминал процессами, но ещё не были на него переданы. Если контроль выходного потока включён (установкой бита IXON режимов ввода), драйвер терминала подчиняется символам START и STOP, переданными терминалом, чтобы приостановить ивозобновить пересылку данных.Очистка очереди ввода терминала — это сброс всех символов, которые были полученыот терминала, но ещё не были прочитаны процессами.
Аналогично, очистка очереди выводатерминала — сброс всех символов, которые были записаны процессами, но ещё не переданына терминал.1.2 Канонический и неканонический вводСистемы POSIX поддерживают два основных режима ввода с терминала: канонический инеканонический.В каноническом режиме ввода с терминала обрабатывается построчно, каждая строказавершается символами перевода строки ’\n’, EOF или EOL. Процесс не может считатьвводимые символы, пока пользователь не введёт целую строку, а функция read возвращаетсамое большее одну строку ввода вне зависимости от того, сколько байт было запрошено.В каноническом режиме ввода некоторые средства для редактирования строки предоставляет само ядро операционной системы. Некоторые символы, такие как ERASE или KILL,обрабатываются специальным образом и обозначают операции редактирования текущейвводимой строки.Константы _POSIX_MAX_CANON и MAX_CANON параметризуют максимальную длинустроки, вводимой в каноническом режиме.
Гарантируется, что максимальная длина строкине меньше значения этих констант, но на самом деле она может быть больше и даже динамически менять размер.В неканоническом режиме ввода символы не группируются в строки, а символы ERASE иKILL не обрабатываются. Частота (гранулярность), с которой считываются символы, задаётся параметрами MIN и TIME.Большинство программ используют канонический режим ввода, поскольку это даёт возможность пользователю редактировать вводимые строки. Неканонический режим обычноиспользуется тогда, когда программа либо обрабатывает односимвольные команды, либопредоставляет свои средства редактирования строки.Выбор между каноническим и неканоническим режимом управляется флагом ICANONполя c_lflag структуры struct termios.1.3 Функции низкоуровневого управления терминаломВ данном разделе рассматриваются некоторые функции низкоуровневого управлениятерминалом.2#include <termios.h>#include <unistd.h>intintintintinttcgetattr(int fd, struct termios *termios_p);tcsetattr(int fd, int action, struct termios *termios_p);tcdrain(int fd);tcflush(int fd, int queue);tcflow(int fd, int action);Функции tcgetattr и tcsetattr считывают и модифицируют режимы работы терминала.
В качестве параметра им передаётся адрес переменной типа struct termios. Этаструктура содержит всю информацию о режимах работы терминала и имеет следующие поля:struct termios{tcflag_t c_iflag;tcflag_t c_oflag;tcflag_t c_cflag;tcflag_t c_lflag;cc_t c_cc[NCCS];};/*/*/*/*/*режимы ввода */режимы вывода */управляющие флаги */локальные флаги */управляющие символы */Данное определение структуры не является точным, для каждой конкретной системы структура может содержать дополнительные поля.
Типы tcflag_t, cc_t и макрос NCCS определяются системой, и их конкретное значение нас не будет интересовать. Назначение каждогополя будет рассмотрено ниже.Хотя в функциях tcgetattr и tcsetattr терминал указывается с помощью файлового дескриптора, атрибуты соответствуют терминалу, а не файловому дескриптору.
Это значит, что изменения атрибутов терминала имеют постоянный эффект, если некоторый другойпроцесс откроет тот же самый терминал, для него будут действовать изменённые атрибуты.Аналогично, если один и тот же процесс имеет несколько файловых дескрипторов, ассоциированных с терминалом (либо полученных через open, либо через dup), изменениеатрибутов терминала на одном файловом дескрипторе затрагивает ввод и вывод на всех файловых дескрипторах, ассоциированных с этим терминалом. Это значит, что нельзя одновременно открыть один файловый дескриптор для чтения с терминала в нормальном построчнобуферизируемом режиме с эхом (канонический режим), а другой файловый дескриптор длячтения с терминала в посимвольном режиме без эха. Вместо этого необходимо явно переключать терминал между этими двумя режимами.Функция tcgetattr возвращает информацию о терминале по открытому файловому дескриптору fd, связанному с терминалом.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.