5

我想编写自己的伪外壳,并希望获得漂亮的颜色等。我该如何欺骗子进程使其认为它在 TTY 中?我已经阅读了有关虚拟 TTY 的信息,但没有找到有关如何创建虚拟 TTY 或如何使子流程认为isatty(stdout) == 1.

4

1 回答 1

8

您要查找的内容称为伪终端、伪 tty 或 pty。它们存在于主/从对中,其行为类似于套接字对(管道的双向版本;写入一端的内容可以在另一端读取)。在控制过程中,使用posix_openpt打开一个master,然后ptsname获取slave的名字(大概/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)设置标准输出到从伪终端;对于标准输入和标准错误也是如此。

(请注意,一些 Linux 联机帮助页错误地声明posix_openpt返回char *。另外,不要被openpty函数族混淆;这些表示已弃用的伪 tty 的旧接口。)

于 2010-11-08T12:05:40.303 回答