Файл, который отвечает isatty(3)
Я хочу написать свою собственную psuedo-shell и хотел бы получить красивые цвета и т. Д. Как мне обмануть подпроцесс, заставив его думать, что он находится в TTY? Я читал о виртуальных TTY, но не нашел много практической информации о том, как его создать или как это заставляет подпроцесс думать, что isatty(stdout) == 1
,
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
семейство функций; они представляют более старый интерфейс для псевдо-ttys, который устарел.)