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