响应isatty的文件(3)

时间:2010-11-08 11:29:13

标签: c linux unix file tty

我想编写自己的psuedo-shell并希望得到漂亮的颜色等。我如何试图让子进程认为它在TTY中?我已经阅读了关于虚拟TTY的内容,但是没有找到关于如何创建一个或如何使子进程认为isatty(stdout) == 1的实用信息。

1 个答案:

答案 0 :(得分:8)

您正在寻找的是伪终端,伪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。

(请注意,some Linux manpages错误地指出posix_openpt返回char *。此外,不要被openpty系列函数混淆;这些代表了较旧的接口弃用的伪ttys。)