Такого рода вещи состоят из двух отдельных частей.
ptsname()
позволяет чему-то с дескриптором открытого файла для главной стороны определить это имя устройства. Вторая часть не может быть продолжена в некоторых операционных системах, пока первая часть не вызовет библиотечные функции 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
, которое ядро использовало каждый раз. Эти служебные процессы работают идентично аналогичным служебным процессам, подключенным к виртуальным терминалам ядра, и в основном так же, как служебные процессы, подключенные к реальным терминалам. Ведомая сторона псевдо-терминала -, в конце концов,предназначен для работы так же, как два других типа терминалов.
pty-get-tty
. Направляющая ноша . Программное обеспечение. pty-run
. Направляющая ноша . Программное обеспечение. console-terminal-emulator
. Направляющая ноша . Программное обеспечение. head0
пользовательский -космический виртуальный терминал . Направляющая ноша . Программное обеспечение. grantpt()
, unlockpt()
и ptsname()
. §3. Руководство по функциям библиотеки FreeBSD . 2008 -08 -20. ptyget
Дэниела Дж. Бернштейна ". djbwares . Программное обеспечение. Не совсем уверен в том, что вы подразумеваете под «потоковой передачей терминала Linux». Вы не включили код. Вы должны открыть /dev/ptmx, чтобы получить pty master fd, и получить fd ведомого устройства (с помощью ioctl или открыть, в зависимости от версии ядра, которое у вас есть ), а затем передать его в вашу оболочку, чтобы ваша оболочка прочитала /напишите как stdxxx. Прямая запись на ведомое устройство не вернет ошибку, проверьте свой код еще раз, возможно, вы закрыли свой главный fd.