
Исходя из того, что я читал о псевдотерминалах в Linux, существует два типа псевдотерминалов:Псевдотерминалы в стиле BSD(который устарел) иПсевдотерминалы UNIX 98.
Я создал два изображения, демонстрирующие мое понимание этих двух типов псевдотерминалов.
На следующем рисунке показано, как работают псевдотерминалы в стиле BSD (поправьте меня, если изображение неверно):
Этот тип псевдотерминалов несложно понять, каждый терминал подключен к уникальному главному драйверу.
Но в псевдотерминалах UNIX 98 все немного запутаннее. На следующем рисунке показано, как, по моему мнению, работает этот тип псевдотерминалов:
Таким образом, по сути, все терминалы используют один и тот же главный драйвер ( /dev/ptmx
), но я не уверен, как главный драйвер узнает, как делать следующее:
Если данные отправляются с одного из терминальных процессов, как главный драйвер узнает, какому подчиненному драйверу TTY следует передать данные?
Если данные отправляются с одного из подчиненных драйверов TTY, как главный драйвер узнает, какому терминальному процессу следует передать данные?
Знает ли главный драйвер, как это сделать так, как я показал на рисунке (т. е. у главного драйвера есть таблица сопоставления, которая сопоставляет каждый PID терминала с соответствующим ему подчиненным драйвером TTY)?
решение1
Вас с любопытством завораживают имена. /dev/ptmx
- это не «драйвер», это просто имя в файловой системе, имеющее особое значение.
Процесс открывает новый главный pty, вызывая posix_openpt()
, который возвращает дескриптор файла; тот же эффект может быть достигнут путем вызова open()
. Каждый раз, когда /dev/ptmx
процесс open()
вызывает/dev/ptmx
новыйпсевдотерминал создается; псевдотерминал уничтожается, когда больше нет процессов, имеющих этот файловый дескриптор открытым. Этот файловый дескриптор ссылается на главную сторону псевдотерминала и может быть передан дочерним процессам, как и любой другой файловый дескриптор.
Более подробную информацию см.unix.stackexchange.com/questions/117981. (Спасибо @JdeBP за предложение.)
Как только у процесса появится файловый дескриптор, ссылающийся на главную сторону псевдотерминала, он может узнать имя подчиненной стороны псевдотерминала, вызвав ptsname()
, и передать это имя любому процессу, которым он хочет управлять через псевдотерминал.