C Разветвить новый tty

Мне нужно создать новую пару tty (ведущий и подчиненный) без использования forkpty().

В человеке pts(4) написано, что:

Когда процесс открывает /dev/ptmx, он получает дескриптор файла для ведущего псевдотерминала (PTM), а в каталоге /dev/pts создается ведомое устройство псевдотерминала (PTS).

С помощью небольшой программы на C я открываю /dev/ptmx следующим образом:

open("/dev/ptmx", O_RDWR);

Но новый pty не создается в /dev/pts/.


person Jeffrey Muller    schedule 20.02.2012    source источник
comment
Почему бы не использовать forkpty()? Это домашнее задание?   -  person Eregrith    schedule 20.02.2012
comment
Пожалуйста, примите ответы на ваши предыдущие вопросы (при условии, что вы нашли их полезными).   -  person John Zwinck    schedule 20.02.2012


Ответы (2)


Чтобы фактически создать пригодную для использования пару pty, вы также должны вызвать grantpt(3) и unlockpt(3) для fd, возвращенного вызовом open. Точно не определено, где именно в этом процессе создается фактический узел подчиненного файла pty в файловой системе - некоторые системы (обычно те, где /dev/pts является специальной файловой системой) будут создавать его при открытии, в то время как другие будут создавать это как часть вызова grantpt или unlockpt. Также не гарантируется, что ведомое устройство будет находиться в /dev/pts — оно может быть где-то еще — поэтому вам нужно вызвать ptsname(3), чтобы узнать, где оно находится.

Также может быть несколько более переносимым вызов posix_openpt(3), а не открытие напрямую.

person Chris Dodd    schedule 20.02.2012
comment
Действительно, posix_openpt является переносимым (/dev/ps/ptmx специфичен для Linux, и я не знаю для него дополнительных преимуществ). Последовательность инструкций такова: создайте мастер с помощью posix_openpt, затем предоставьте к нему доступ с помощью grantpt, указав мастер в качестве параметра, затем разблокируйте пару с помощью unlockpt, затем получите имя файла подчиненного устройства, чтобы позже открыть его с помощью ptsname, затем откройте имя файла, возвращаемое ptsname с обычным open; все как описано в POSIX 1. - person Hibou57; 28.03.2013
comment
Вот еще слова из POSIX о ptmx: «Разработчики стандартов считали вопрос добавления специального устройства для клонирования мастер-псевдотерминалов: устройство /dev/ptmx. Однако консенсуса достичь не удалось, и считалось, что добавление новой функции позволит реализовать другие реализации». Также обратите внимание, как они рассматривали /dev/ptmx вместо Linux /dev/ps/ptmx - person Hibou57; 29.03.2013

Вот хороший учебник по теме: Использование псевдотерминалов для управления интерактивными программами, pty, пдип. Если эта ссылка заканчивается ошибкой 403, вот еще одна: http://rkoucha.fr/tech_corner/pty_pdip.html

В частности, посмотрите на исходный код в середине страницы под заголовком «Взаимодействие между процессами через псевдотерминал». Это пример процесса, который разветвляется, а затем два процесса взаимодействуют друг с другом через PTY, ранее открытый родительский процесс.

person Hibou57    schedule 28.03.2013
comment
Эта ссылка не работает. - person Sapphire_Brick; 08.11.2020
comment
@Sapphire_Brick, это ошибка 403 :p Вот еще одна ссылка с тем же самым: rkoucha.fr/tech_corner/pty_pdip .html - person Hibou57; 28.11.2020