Ответ 1
То, что вы ищете, называется псевдотерминалами, псевдо-ttys или ptys. Они существуют в парах ведущего/ведомого, которые ведут себя аналогично парам сокетов (двунаправленная версия труб, то, что написано на одном конце, можно прочитать на другом). В процессе управления используйте posix_openpt
, чтобы открыть мастер, затем ptsname
, чтобы получить имя ведомого (возможно, /dev/pts/X
):
int master = posix_openpt(O_RDWR | O_NOCTTY);
grantpt(master); /* change ownership and permissions */
unlockpt(master); /* must be called before obtaining slave */
int slave = open(ptsname(master), O_RDWR | O_NOCTTY);
Как обычно, каждая функция может выйти из строя, поэтому добавьте проверку ошибок. Теперь slave
fd относится к ведомому устройству. Используйте dup2(slave, STDOUT_FILENO)
в дочернем процессе для установки стандартного вывода на подчиненный псевдотерминал; аналогично для stdin и stderr.
(Обратите внимание, что некоторые файлы Linux неправильно указывают, что posix_openpt
возвращает char *
. Кроме того, не путайте openpty
семейство функций, которые представляют собой более старый интерфейс для псевдотетий, который устарел.)