Файл, который отвечает на 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 семейство функций, которые представляют собой более старый интерфейс для псевдотетий, который устарел.)