如何在TTY中实现terminfo延迟/填充?

时间:2015-10-27 13:59:51

标签: linux unix terminal tty

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

TERM=ansi77 strace -o log.txt tput dl1

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

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

2 个答案:

答案 0 :(得分:2)

如果实施延迟,则通过传输填充字符(传统的NUL字符)来完成。填充字符可以通过变量 pad pc 的termdata / terminfo设置进行更改。

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

所需的打击垫字符数是根据波特率计算的 - 因此它取决于可用且准确的信息。

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

答案 1 :(得分:1)

同意@cliffordheath填充是通过添加填充字符完成的,对可用文档的引用可以提供帮助。

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

填充字符的 terminfo 名称为 pad ; pc 是一个termcap名称(请参阅terminfo(5)):

   pad_char                  pad    pc   padding char
                                         (instead of null)

terminfo手册页有一个冗长的段落(在Types of Capabilities中)处理填充。 terminfo格式支持两种类型的填充(建议强制),以其格式区分。 termcap仅支持后者(当然使用不同的语法),并且与terminfo不同,所有延迟都是一次发生的(使&#34; flash&#34的转义序列通常不起作用)。

命令行tput程序不只是作为函数tputs的包装器,而是在输出字符串时使用它。命令行程序提供输出布尔值,数字和字符串功能。

库调用tputs有一个参数,用于计算延迟时考虑的受影响行数(如波特率)。

在OP的问题中

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

指定与受影响的行数成比例的延迟(由"*"字符标记)。受命令行 tput实用程序影响的行数为1.它调用putp来执行此操作。但是,它会调用delay_output,然后调用baudrate。最后一个功能仅在终端初始化时初始化。命令行tput 初始化终端,因此延迟不适用于 。你应该看到(给定正确的速度)使用库本身的延迟。

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