Файл, который отвечает 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);

Как обычно, каждая функция может дать сбой, поэтому добавьте проверку ошибок.slavefd теперь относится к ведомому устройству. использованиеdup2(slave, STDOUT_FILENO)в дочернем процессе установить стандартный вывод на подчиненный псевдотерминал; аналогично для stdin и stderr.

(Обратите внимание, что на некоторых страницах Linux неправильно указано, что posix_openpt возвращается char *, Кроме того, не смущайтесь openpty семейство функций; они представляют более старый интерфейс для псевдо-ttys, который устарел.)

Другие вопросы по тегам