【问题标题】:how is terminfo delay/padding implemented in TTYs?terminfo 延迟/填充是如何在 TTY 中实现的?
【发布时间】:2015-10-27 13:59:50
【问题描述】:

我一直在查看 terminfo,但它有延迟,例如$<5>,在功能字符串中。我试图通过在strace 下运行tput 来查看延迟是如何实现的,即,它是通过例如nanosleep 还是通过插入NUL 或其他字符来实现的。这是我尝试运行和跟踪的命令:

TERM=ansi77 strace -o log.txt tput dl1

我在ansi77 上选择了dl1,因为它被定义为dl1=\E[M$<5*/>。但是,我在跟踪中看到的只是 3 个字节的写入:

write(1, "\33[M", 3)                    = 3
  1. 所以,我的问题是,延迟实际上是如何实现的?填充字符还是简单的进程/线程睡眠?
  2. 我可以在终端模拟器中观察还是需要真正的硬件终端才能看到?
  3. 尝试使用tput 重现它有什么缺陷吗?

【问题讨论】:

  • 没有被问到的问题是房间里的大象:现代实现是否会打扰?
  • @WumpusQ.Wumbley:嗯,如果你用串口线连接真实终端呢?至少在这种情况下,它应该尊重延迟。

标签: linux unix terminal tty


【解决方案1】:

同意@cliffordheath 的观点,即通过添加填充字符来完成填充,参考可用的文档会有所帮助。

硬件终端并没有停止存在,它们仍然是supported by ncurses。如果没有填充,这些旧终端将无法正常工作(丢弃或破坏您的输出)。 vt100 条目使用填充,xterm 不使用。

填充字符的 terminfo 名称是 padpc 是一个 termcap 名称(参见 terminfo(5)):

   pad_char                  pad    pc   padding char
                                         (instead of null)

terminfo 手册页有一个很长的段落(Types of Capabilities)处理填充。 terminfo 格式支持两种类型的填充(advisorymandatory),以它们的格式区分。 termcap 仅支持后者(当然使用不同的语法),并且与 terminfo 不同,所有延迟都同时发生(使“flash”的转义序列通常不起作用)。

命令行tput 程序不仅仅充当函数tputs 的包装器,但它在输出字符串时使用它。命令行程序提供了输出布尔、数字,当然还有字符串的能力。

库调用tputs 有一个参数表示受影响的线路数,在计算延迟时会考虑(如波特率)。

在 OP 的问题中

dl1=\E[M$<5*/>

指定与受影响的行数成比例的延迟(由"*" 字符标记)。 命令行 tput 实用程序受影响的行数为 1。它调用 putp 来执行此操作。然而,这反过来又调用delay_output,然后又调用baudrate。最后一个函数仅在终端初始化时才被初始化。命令行tput 不会 初始化终端,因此延迟对那个 不起作用。您应该会看到(在适当的速度下)使用库本身的延迟。

ncurses 还提供napms(毫秒)的时间延迟,这与填充不同。

【讨论】:

  • 这似乎是关于填充的随机集合,无法回答实际问题:如果 tput 应该支持填充,为什么我们看不到它实际上在其中写入任何填充字节strace?
  • 如果您没有看到任何空值,那是因为优化器确定不需要空值或会影响结果。
  • tack 不初始化终端吗?我开始对此进行调查,因为我在tack 中遇到了flash 失败。真正奇怪的是,tput 似乎在睡觉,但在编写整个序列之前而不是在它的中间。
  • 也只是作为一个好奇点,“受影响的行数”对于诸如行插入/删除/滚动删除的行数,移动的行数(如果滚动更多,则更少)行),还是行数改变(光标和屏幕底部之间的距离,或多或少)?
  • 把它想象成要重绘的行数。
【解决方案2】:

在实现延迟的地方,它是通过传输填充字符(传统上是 NUL 字符)来完成的。填充字符可以通过变量 padpc 的 termdata/terminfo 设置来更改。

填充字符是必要的,因为程序无法知道先前发送的字符何时实际写入,以启动 CPU 延迟。即使内核在输出刷新后处理完这些字符,字符仍可能会缓冲在输出设备 UART 中。

所需填充字符的数量是根据波特率计算得出的 - 因此这取决于该信息是否可用且准确。

库中的 tputs 例程实现了填充(参见 man 3 tputs)。我怀疑命令行工具也是如此,因为它基本上只是一个包装器。

【讨论】:

  • 好的。但是为什么我看不到tput 产生的延迟?
  • 我只有很老的源代码。除非您使用的是连接到物理 RS​​-232 设备的终端,否则您很可能不会看到任何延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2014-06-02
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多