PTY(7) | Руководство программиста Linux | PTY(7) |
pty - интерфейсы псевдо-терминалов
Псевдо-терминал (иногда применяют сокращение «pty») — это пара виртуальных символьных устройств, которые предоставляют двунаправленный канал обмена. Один конец канала называется основным (master); другой конец канала называется подчинённым (slave). Подчинённый конец псевдо-терминала предоставляет интерфейс, который работает также как обычный классический терминал. Процесс, который управляется через терминал, может открыть подчинённый конец псевдо-терминала и затем управляться программой, которая открыла основной конец. Всё что пишется в основной конец поступает процессу на подчинённом конце так, как-будто данные вводились с терминала. Например, запись символа прерывания (обычно control-C) в основной конец приводит к генерации сигнала прерывания (SIGINT) для группы активных процессов, которая подключена к подчинённому концу. И наоборот, всё что записывается в в подчинённый конец псевдо-терминала, может быть прочитано процессом, который подключён к основному концу. Псевдо-терминалы используются такими приложениями как службы сетевого входа (ssh(1), rlogin(1), telnet(1)), эмуляторами терминалов xterm(1), script(1), screen(1), tmux(1), unbuffer(1) и expect(1).
Поток данных между основным и подчинённым концом обрабатывается асинхронно, почти как поток с физического терминала. Данные, записываемые в подчинённый конец, будут доступны без промедления, но могут быть недоступны немедленно. Схожим образом, есть маленькая задержка обработки между записью в основной конец и когда эти данные станут видимы на подчинённом конце.
Исторически существует два программных интерфейса для взаимодействия с псевдо-терминалами: BSD и System V. В SUSv1 стандартизирован программный интерфейс, основанный на программном интерфейсе System V, который должен применяться во всех новых программах, использующих псевдо-терминалы.
В Linux есть оба типа псевдо-терминалов — BSD и (стандартизированный) System V. В системах Linux терминалы System V часто называют псевдо-терминалами UNIX 98. Начиная с ядра версии 2.6.4 псевдо-терминалы BSD признаны устаревшими (их можно отключить во время настройки ядра). В новых программах следует использовать псевдо-терминалы UNIX 98.
Незадействованный основной псевдо-терминал UNIX 98 открывается вызовом posix_openpt(3) (эта функция открывает основное клонирующее устройство, /dev/ptmx; смотрите pts(4)). После выполнения специальной программной инициализации (с помощью grantpt(3) изменяется владелец и права на подчинённое устройство и с помощью unlockpt(3) разблокируется подчинённое устройство), соответствующее подчинённое устройство можно открыть, передав имя, полученное от ptsname(3), в вызов open(2).
Ядро Linux задаёт ограничение на количество доступных псевдо-терминалов UNIX 98. В ядрах до версии 2.6.3 включительно, это ограничение настраивалось при компиляции ядра (CONFIG_UNIX98_PTYS), и разрешалось 2048 псевдо-терминалов (по умолчанию 256). Начиная с версии 2.6.4, ограничение динамически настраивается через /proc/sys/kernel/pty/max, а в файле /proc/sys/kernel/pty/nr хранится количество уже используемых псевдо-терминалов. Подробности об этих двух файлах смотрите в proc(5).
Псевдо-терминалы в стиле BSD предоставляются в виде заранее созданных пар, с именами вида /dev/ptyXY (основной) и /dev/ttyXY (подчинённый), где X это буква из 16-символьного набора [p-za-e], а Y это буква из 16-символьного набора [0-9a-f] (точный диапазон символов этих наборов отличается в разных реализациях UNIX). Например, /dev/ptyp1 и /dev/ttyp1 составляют псевдо-терминальную пару BSD. Процесс находит неиспользуемую псевдо-терминальную пару пробуя вызывать open(2) с каждым основным псевдо-терминалом, пока вызов не выполнится успешно. Затем может быть открыт соответствующий подчинённый псевдо-терминал (подставив «tty» вместо «pty» имени основного конца).
Описание запроса TIOCPKT ioctl(2), который управляет пакетным режимом, можно найти в ioctl_tty(2).
Вызовы ioctl(2) для BSD TIOCSTOP, TIOCSTART, TIOCUCNTL и TIOCREMOTE не реализованы в Linux.
ioctl_tty(2), select(2), setsid(2), forkpty(3), openpty(3), termios(3), pts(4), tty(4)
2017-09-15 | Linux |