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