В некоторых операционных системах , включая Unix-подобные системы, псевдотерминал , псевдотерминал или PTY представляет собой пару конечных точек псевдоустройств (файлов), которые устанавливают асинхронный двунаправленный канал связи ( IPC ) (с двумя портами) между двумя или более процессами. [1] [2] [3]
Одно псевдоустройство в паре, master , предоставляет средства, с помощью которых эмулятор терминала или удаленный сервер входа (например, сервер Telnet , rlogin или Secure Shell ) [3] управляет подчиненным процессом . Другое псевдоустройство, slave , эмулирует аппаратное устройство последовательного порта [1] и используется программами, ориентированными на терминал, такими как оболочки (например, bash ), в качестве процессов для чтения/записи данных обратно с/на главную конечную точку. [1] PTY похожи на двунаправленные каналы. [3] : 1388
Devpts — это виртуальная файловая система ядра Linux, содержащая псевдотерминальные устройства.
Реализация Linux основана на терминалах в стиле System V (обычно называемых псевдотерминалами UNIX 98) [4] и предоставляет POSIX и API единой спецификации Unix в форме функции posix_openpt() с 1998 года. [5]
Псевдотерминалы присутствовали в мониторе DEC PDP-6 Timesharing Monitor по крайней мере еще в 1967 году и использовались для реализации пакетной обработки. Они описаны в документации для последующего TOPS-10 на PDP-10 . [6] Другие операционные системы DEC также имели PTY, включая RSTS/E для PDP-11 , как и сторонняя операционная система TENEX для PDP-10.
Реализации псевдотерминалов Unix восходят к модификациям, которые RAND и BBN внесли в 6-е издание в конце 1970-х годов для поддержки удаленного доступа по сети. [7]
Современные псевдотерминалы Unix возникли в 1983 году во время разработки восьмого издания Unix и были основаны на аналогичной функции в TENEX. [8] Они были частью выпуска 4.2 BSD с довольно громоздким openpty()
интерфейсом, определенным для использования. [9]
System V от AT&T включала поддержку псевдотерминалов в качестве драйвера в своей модели устройства STREAMS , а также псевдотерминальный мультиплексор ( /dev/ptmx ). Позже это развилось в стиль PTY в Unix98.
Linux Programming Interface от 2010 года содержит целую главу (глава 64 "Псевдотерминалы" стр. 1375–1399.) с объяснением псевдотерминалов. Затем есть еще одна глава, Глава 62 "Терминалы", посвященная терминалам.
В 2018 году консоль Windows была расширена и получила интерфейс PTY под названием ConPTY. [10]
Роль процесса эмулятора терминала:
Процесс эмулятора терминала также должен обрабатывать команды управления терминалом, например, для изменения размера экрана. Широко используемые программы эмулятора терминала включают xterm , GNOME Terminal , Konsole и Terminal .
Удаленные серверы входа, такие как серверы Secure Shell и Telnet, играют ту же роль, но взаимодействуют с удаленным пользователем, а не с локальным.
Screen и Tmux используются для добавления контекста сеанса в псевдотерминал, что делает решение гораздо более надежным и универсальным. Например, каждый из них обеспечивает сохранение терминала, позволяя пользователю отключаться от одного компьютера, а затем подключаться позже с другого компьютера.
В системе BSD PTY файл подчиненного устройства, который обычно имеет имя в форме /dev/tty[p-za-e][0-9a-f]
, поддерживает все системные вызовы, применимые к текстовым терминальным устройствам. Таким образом, он поддерживает сеансы входа в систему . Файл главного устройства, который обычно имеет имя в форме /dev/pty[p-za-e][0-9a-f]
, является конечной точкой для связи с эмулятором терминала. При такой [p-za-e]
схеме именования может быть не более 256 пар tty. Кроме того, поиск первого свободного главного устройства pty может быть сложным, если не принята схема блокировки. По этой причине последние операционные системы BSD, такие как FreeBSD , реализуют Unix98 PTY. [11]
BSD PTY были вытеснены Unix98 pty, чья система именования не ограничивает количество псевдотерминалов и доступ к которым происходит без опасности возникновения состояний гонки. /dev/ptmx
является «мультиплексором главного псевдотерминала». Его открытие возвращает файловый дескриптор главного узла и приводит к созданию связанного подчиненного узла. [12]/dev/pts/N