• Реализуйте некий механизм безопасности, который не дает несанкционированному процессу подключиться к слушающему порту клиента. Для этого клиентская сторона могла бы отправлять серверу определенный код (то есть какое-то уникальное сообщение наподобие cookie), используя обычный сокет. Затем сервер мог бы возвращать данный код через приоритетный сокет с целью предоставить клиенту возможность проверить его подлинность.
• Чтобы иметь возможность экспериментировать с передачей обычных и высокоприоритетных данных от клиента к серверу, вы должны предусмотреть в своем сервере мультиплексирование ввода из двух сокетов с помощью вызова select() или poll() (которые будут описаны в разделе 59.2).
Исторически сложилось так, что для получения доступа к системе UNIX использовался терминал, подключенный через последовательный порт (соединение RS-232). В те времена терминалы представляли собой мониторы на основе электронно-лучевой трубки (ЭЛТ), способные отображать символы и, в некоторых случаях, примитивную графику. Обычно такие мониторы имели черно-белый экран с 24 строчками и 80 столбцами. С точки зрения современных стандартов они были маленькими и дорогими. А еще раньше в качестве терминалов служили телетайпы. Последовательные порты также применялись для подключения других устройств, таких как принтеры и модемы, и для соединения компьютеров между собой.
В первых системах UNIX терминал, подключенный к компьютеру через последовательный порт, был представлен в виде символьного устройства с именем вида /dev/ttyn (в Linux такие устройства являются виртуальными консолями). Аббревиатуру tty (от англ. teletype — «телетайп») часто задействуют для сокращенного обозначения терминала.
Изначально, особенно в первые годы существования UNIX, терминальные устройства не были стандартизованы; это значит, что для выполнения таких операций, как перемещение курсора в начало строки или в верхнюю часть экрана применялись разные последовательности символов. (Со временем некоторые фирменные реализации таких управляющих последовательностей, как, например, VT-100 компании Digital, стали стандартами ANSI — сначала де-факто, а затем и формально; тем не менее параллельно с ними продолжало существовать множество других разновидностей терминалов.) Нехватка стандартизации усложняла написание портируемых программ, полагавшихся на возможности терминала. Одним из первых примеров подобных программ был редактор vi. В ответ на такую ситуацию были разработаны базы данных termcap и terminfo (описаны в [Strang et al., 1988]), которые инкапсулировали выполнение различных экранных операций для широкого множества терминалов. Можно также вспомнить библиотеку curses с аналогичными функциями [Strang, 1986].
В наши дни традиционный терминал вышел из широкого обихода. Стандартным интерфейсом к современным UNIX-системам является оконный диспетчер X Window System, выводящий информацию на высокопроизводительном графическом мониторе. (Все возможности традиционного терминала в X Window System можно заменить одним оконным приложением — xterm или подобным; именно тот факт, что пользователи таких терминалов имели всего лишь одно «окно» в систему, стал движущей силой для разработки механизмов управления заданиями, описанных в разделе 34.7.) Аналогично многие устройства, которые ранее подключались к компьютеру напрямую (такие как принтеры), стали более «умными» и теперь доступны по сети.
Все вышесказанное является преамбулой к следующему факту: потребность в программировании терминальных устройств возникает не так часто, как когда-то. Поэтому в данной главе мы сосредоточимся на аспектах программирования, связанных с программными эмуляторами терминалов (такими как xterm и ему подобными). Последовательные порты будут затронуты лишь вскользь; источники дополнительной информации о них указаны в конце главы.
И традиционные терминалы, и их эмуляторы полагаются на специальный драйвер, выполняющий операции ввода/вывода с соответствующим устройством (в случае с эмулятором таким устройством является псевдотерминал, который будет описан в главе 60). Влиять на различные аспекты работы этого драйвера можно с помощью функций, описанных в настоящей главе.
Драйвер терминала поддерживает два режима ввода.
•