我一直在试图弄清楚TTY驱动程序现在是如何工作的(完全理解每个内核的实现可能会有所不同),并且发现了一篇很好的文章:The TTY demystified
我注意到它声称xterm没有stdin
,stdout
或stderr
。 xterm和其他终端模拟器如何从bash和其他子进程获取输入,以便它可以打印到窗口?终端仿真器是否完全连接到TTY驱动程序?
答案 0 :(得分:1)
我认为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
,例如通过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)
设备为终端仿真器提供PTY主站和从站的pipe
连接。对于这些pipe
,终端仿真器软件与客户端和内核进行通信。
我不能做tty
层正义;我强烈建议您阅读Advanced Programming in the Unix Environment, 2nd edition中的pty
部分以获取完整详情。本书(和source code包括编写您自己的pty
驱动程序,可用于实现script(1)
- 类似功能或欺骗标准C IO流使用行缓冲而不是块缓冲当程序没有提供任何命令行选项来本机控制它。