Файл, который отвечает isatty (3) - PullRequest
5 голосов
/ 08 ноября 2010

Я хочу написать свой собственный psuedo-shell и хотел бы получить красивые цвета и т.д. Я читал о виртуальных TTY, но не нашел много практической информации о том, как его создать или как это заставляет подпроцесс думать, что isatty(stdout) == 1.

1 Ответ

8 голосов
/ 08 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...