gpt4 book ai didi

tty - Linux下TTY的内部工作原理

转载 作者:行者123 更新时间:2023-12-04 19:39:25 46 4
gpt4 key购买 nike

我一直在试图弄清楚 TTY 驱动程序是如何工作的(充分理解每个内核的实现可能不同),并且偶然发现了一篇不错的文章:The TTY demystified

但是我注意到它声称 xterm 没有 stdin , stdoutstderr . 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 ,通过 perror(3) 说,它的输出可能会发送到您启动它的终端或 session 错误日志,例如 ~/.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层正义;我强烈推荐阅读 pty来自 Advanced Programming in the Unix Environment, 2nd edition 的部分完整的细节。这本书(和 source code 包括编写您自己的 pty 驱动程序,该驱动程序可用于实现 script(1) 类似功能或在程序不使用时欺骗标准 C IO 流使用行缓冲而不是 block 缓冲提供任何命令行选项来本地控制它。

关于tty - Linux下TTY的内部工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145192/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com