我一直在试图弄清楚 TTY 驱动程序是如何工作的(充分理解每个内核的实现可能不同),并且偶然发现了一篇不错的文章:The TTY demystified
但是我注意到它声称 xterm 没有stdin
,stdout
或stderr
. xterm 和其他终端仿真器如何从 bash 和其他子进程获取输入以便打印到窗口?终端仿真器是否与 TTY 驱动程序有连接?
我一直在试图弄清楚 TTY 驱动程序是如何工作的(充分理解每个内核的实现可能不同),并且偶然发现了一篇不错的文章:The TTY demystified
但是我注意到它声称 xterm 没有stdin
,stdout
或stderr
. xterm 和其他终端仿真器如何从 bash 和其他子进程获取输入以便打印到窗口?终端仿真器是否与 TTY 驱动程序有连接?
我不相信xterm(1)
没有stdin
,stdout
或stderr
有多大意义的说法。而且,只是略读那篇文章,我认为他们在图表上是空白的,因为他们对他所描述的内容没有太多了解。
您可以很容易地检查自己终端的文件描述符。我通常使用的urxvt(1)
终端是这样的:
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 0 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 1 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 2 -> /home/sarnold/.xsession-errors
xterm(1)
我从其中一个终端开始urxvt(1)
看起来像这样:
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:45 0 -> /dev/pts/1
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:45 1 -> /dev/pts/1
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:45 2 -> /dev/pts/1
我xterm(1)
开始使用我的窗口管理器的dmenu(1)
启动器如下所示:
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:46 0 -> /dev/null
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:46 1 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:46 2 -> /home/sarnold/.xsession-errors
关于stdin
、stdout
和的重要部分stderr
是它们与终端仿真器提供的图形显示完全无关。如果您的终端程序需要将错误写入stderr
,例如 via perror(3)
,它的输出可能会发送到您启动它的终端或会话错误日志,例如~/.xsession-errors
. 如果您通过以下方式登录ssh(1)
并xterm(1)
像这样开始:
DISPLAY=:1 xterm -e 'echo hello ; sleep 10`
你会看到它启动并显示hello
。(假设您DISPLAY
与我的匹配。)如果您将命令更改为:
DISPLAY=:1 xterm -fn fiddly -e 'echo hello ; sleep 10'
您会看到有关不正确字体的错误消息被发送到您开始的终端xterm(1)
——而不是它自己的图形界面。(这有点好笑,因为如果您更改SHELL
为不存在的内容,或者尝试执行不存在的内容,错误消息将在图形窗口中打印,而不是标准错误。)
在我的终端模拟器中也打开的文件是ptmx(4)
:
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 0 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 1 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 2 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 3 -> anon_inode:[eventpoll]
lr-x------ 1 sarnold sarnold 64 2011-11-10 21:33 4 -> pipe:[16398]
l-wx------ 1 sarnold sarnold 64 2011-11-10 21:33 5 -> pipe:[16398]
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 6 -> socket:[16399]
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 7 -> /dev/ptmx
打开ptmx(4)
设备会为终端仿真器pipe
提供 PTY 主机和从机的连接。pipe
终端仿真器软件与客户端和内核进行通信的正是这些s。
我无法做到tty
层正义;我强烈建议阅读Unix 环境中的高级编程,第 2 版pty
中的部分以获取完整的详细信息。这本书(和源代码包括编写您自己的驱动程序,该驱动程序可用于实现类似功能或在程序不提供任何命令行选项来控制时欺骗标准 C IO 流使用行缓冲而不是块缓冲这个是原生的。pty
script(1)