我一直在看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.那么,我的问题是,延迟实际上是如何实施的?填充字符还是简单的进程/线程休眠?
1.我可以在终端模拟器中观察它吗?还是需要真实的硬件终端才能看到它?
1.尝试用tput
复制它有什么缺陷吗?
2条答案
按热度按时间q3qa4bjr1#
与@cliffordheath讨论填充是通过添加填充字符来完成的,参考可用的文档可以有所帮助。
硬件终端并没有停止存在,它们仍然受到ncurses的支持。如果没有填充,这些旧的终端将无法正常工作(丢弃或损坏输出)。
vt100
条目使用填充,而xterm
则没有。填充字符的 terminfo 名称为**
pad
;pc
**是一个termcap名称(参见terminfo(5)):terminfo手册页有一个很长的段落(在 Types of Capabilities 中)处理填充。Terminfo格式支持两种类型的填充(advisory 和 mandatory),按格式区分。termcap只支持后者(当然使用了不同的语法),并且与terminfo不同,所有的延迟都是一次发生的(使得“flash”的转义序列通常不起作用)。
命令行
tput
程序不仅仅充当函数tputs
的 Package 器,而且在输出字符串时使用 Package 器。命令行程序提供了输出布尔值、数字和字符串的功能。库调用
tputs
有一个参数,表示在计算延迟时要考虑的受影响的行数(如波特率)。关于OP的问题
指定与受影响的行数成比例的延迟(由
"*"
字符标记)。* 命令行 *tput
实用程序受影响的行数为1。它调用putp
来完成此操作。但是,这又调用了delay_output,而delay_output调用了波特率。最后一个函数仅在终端初始化时初始化。命令行tput
并不初始化终端,所以延迟对 that 不起作用。你应该看到(在正确的速度下)使用库本身的延迟。ncurses还提供
napms
(毫秒)的时间延迟,这与填充不同。kmynzznz2#
在实现延迟的地方,它是通过传输填充字符(传统上是NUL字符)来实现的。pad字符可以通过变量 pad 或 pc 的termdata/terminfo设置来更改。
填充字符是必要的,因为程序无法知道以前发送的字符实际上何时被写入以启动CPU延迟。即使内核在输出刷新后处理完它们,字符仍然可能在输出设备中缓冲。
所需的填充字符数是根据波特率计算的-因此它取决于该信息的可用性和准确性。
库中的tputs例程实现了填充(参见 man 3 tputs)。我怀疑命令行工具也是如此,因为它基本上只是一个 Package 器。