документация по ptmx и pts [закрыта]

-1
22.09.2018, 17:03
2 ответа

Такого рода вещи состоят из двух отдельных частей.

  1. Как вы определили, вы открываете главную сторону псевдо-терминала -, и это создает файл устройства подчиненной стороны -, который можно открыть. Библиотечная функция ptsname()позволяет чему-то с дескриптором открытого файла для главной стороны определить это имя устройства.
  2. Та же или другая программа в другом процессе открывает подчиненную сторону, обрабатывая ее точно так же, как реальные и виртуальные терминалы обрабатываются подсистемой входа :, устанавливая этот процесс в качестве лидера сеанса; установка ведомой стороны в качестве управляющего терминала для сеанса; и установка стандартного ввода, вывода и ошибок в качестве дескрипторов открытых файлов на ведомой стороне. Затем он по цепочке загружает любую подходящую интерактивную программу, которая, среди прочего, действительно может быть оболочкой.

Вторая часть не может быть продолжена в некоторых операционных системах, пока первая часть не вызовет библиотечные функции grantpt()и unlockpt(). Блокировки в ядре предотвращают возможность открытия ведомой стороны до тех пор, пока это не произойдет на ведущей стороне.

Интересно, что эти функции (, появившиеся в AT&T Unix System 5 Release 4 ), оказались ненужными. Они являются результатом реализаций, в которых ведомое устройство создается не той учетной записью пользователя и с неправильными разрешениями, или даже более старых реализаций, в которых ведомые устройства являются постоянными узлами символьных устройств (, чьи разрешения и права собственности сохраняются. от того, что они были в последний раз установлены в )и не создаются на лету,что приводит к появлению возможностей в различных обстоятельствах для программы злоумышленника, запускаемой другими пользователями, для получения доступа к терминалу. Но в настоящее время ядра некоторых операционных систем просто предоставляют ведомым устройствам соответствующие права собственности и разрешения с самого начала -, что, как следствие, позволяет этим функциям по существу не быть -операциями. И FreeBSD, и OpenBSD в настоящее время работают таким образом. К сожалению, несмотря на несколько слухов разработчиков ядра на этот счет на протяжении многих лет, Linux не является одним из таких ядер.

Вторая часть намеренно расплывчата в отношении того, что именно это за другой процесс. Обычная архитектура заключается в том, что ведущий процесс -выполняет fork(), вызывает ptsname(), открывает ведомое устройство и закрывает файловый дескриптор главной стороны. Это то, что делает pty-runв наборе инструментов nosh, из которого можно создавать такие инструменты, как ptybandageи ptyrun. Так работают script, GNU Screen, tmux и эмуляторы терминала с графическим интерфейсом, такие как XTerm.

Но это не необходимая вещь. Пока ему известно имя открываемого файла, подчиненный процесс не обязательно должен быть дочерним fork()ed по отношению к главному процессу. В самом деле, отсутствие этого избавляет от необходимости знать о главной стороне или о том, что терминал является, в частности, псевдотерминалом -.

Например, в моей пользовательской подсистеме виртуального терминала -запущенный процесс console-terminal-emulatorсоздает символическую ссылку с известным фиксированным именем, указывающим на имя файла ведомого устройства. Совершенно отдельные служебные процессы используют известное фиксированное имя для открытия ведомого устройства без необходимости знать точное имя /dev/pts/N, которое ядро ​​использовало каждый раз. Эти служебные процессы работают идентично аналогичным служебным процессам, подключенным к виртуальным терминалам ядра, и в основном так же, как служебные процессы, подключенные к реальным терминалам. Ведомая сторона псевдо-терминала -, в конце концов,предназначен для работы так же, как два других типа терминалов.

Дополнительная литература

5
28.01.2020, 05:07

Не совсем уверен в том, что вы подразумеваете под «потоковой передачей терминала Linux». Вы не включили код. Вы должны открыть /dev/ptmx, чтобы получить pty master fd, и получить fd ведомого устройства (с помощью ioctl или открыть, в зависимости от версии ядра, которое у вас есть ), а затем передать его в вашу оболочку, чтобы ваша оболочка прочитала /напишите как stdxxx. Прямая запись на ведомое устройство не вернет ошибку, проверьте свой код еще раз, возможно, вы закрыли свой главный fd.

0
28.01.2020, 05:07

Теги

Похожие вопросы