То, что вы ищете, называется псевдотерминалами, псевдо-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
; они представляют собой более старый интерфейс для псевдо Это устаревшее.)