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

我一直在看terminfo,在能力string中有延迟,例如$<5> 。 我试图通过运行tput看看延迟是如何实现的,也就是说,它是通过例如nanosleep还是通过插入NUL或其他字符来实现的。 这是我试图运行和跟踪的命令:

 TERM=ansi77 strace -o log.txt tput dl1 

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

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

与@cliffordheath同意,通过添加填充字符来完成填充,参考可用的文档可以提供帮助。

硬件终端并不是不复存在,它们仍然受到ncurses的支持 。 如果没有填充,这些旧的终端将无法正常工作(丢弃或损坏您的输出)。 vt100条目使用填充,对于xterm不。

填充字符的terminfo名称是pad ; pc是termcap名称(参见terminfo(5) ):

  pad_char pad pc padding char (instead of null) 

terminfo手册页有一个冗长的段落(在Capabilities类型中 )处理填充。 有两种类型的填充支持terminfo格式( 建议强制 ),以其格式来区分。 termcap只支持后者(当然使用不同的语法),与terminfo不同,所有的延迟都发生在同一时间(使得“flash”的转义序列通常不起作用)。

命令行输出程序不仅仅是作为函数输出的包装,而是在输出字符串时使用。 命令行程序提供了输出布尔值,数字值,当然还有字符串功能。

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

在OP的问题

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

指定与受影响行数成比例的延迟(用"*"字符标记)。 受影响的命令行 tput实用程序的行数为1.它调用putp来执行此操作。 然而,这又调用delay_output ,并调用波特率 。 最后一个功能只有在终端初始化时才被初始化。 命令行输入不会初始化终端,所以延迟将不起作用。 你应该看到(给出正确的速度)使用库本身的延迟。

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

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

填充字符是必需的,因为程序无法知道以前发送的字符何时被写入,以便启动CPU延迟。 即使在输出刷新后内核已经完成,字符仍可能会被缓存在输出设备UART中。

所需填充字符的数量是从波特率中计算出来的,因此它取决于可用信息的准确性。

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