我一直在关注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
tput
答案 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
(毫秒)的时间延迟,这与填充不同。