Псевдотерминалы в стиле BSD против псевдотерминалов UNIX 98

Псевдотерминалы в стиле BSD против псевдотерминалов UNIX 98

Исходя из того, что я читал о псевдотерминалах в 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(), и передать это имя любому процессу, которым он хочет управлять через псевдотерминал.

Связанный контент