Linux 如何在TTYs中实现terminfo延迟/填充?
我一直在查看terminfo,它在功能字符串中有延迟,例如,Linux 如何在TTYs中实现terminfo延迟/填充?,linux,unix,terminal,tty,Linux,Unix,Terminal,Tty,我一直在查看terminfo,它在功能字符串中有延迟,例如,$。我试图通过在strace下运行tput来了解延迟是如何实现的,例如,它是通过nanosleep实现的,还是通过插入NUL或其他字符实现的。这是我尝试运行和跟踪的命令: TERM=ansi77 strace -o log.txt tput dl1 我在ansi77上选择了dl1,因为它被定义为dl1=\E[M$。然而,我在跟踪中看到的只是写入3个字节: write(1, "\33[M", 3)
$
。我试图通过在strace
下运行tput
来了解延迟是如何实现的,例如,它是通过nanosleep
实现的,还是通过插入NUL
或其他字符实现的。这是我尝试运行和跟踪的命令:
TERM=ansi77 strace -o log.txt tput dl1
我在ansi77
上选择了dl1
,因为它被定义为dl1=\E[M$
。然而,我在跟踪中看到的只是写入3个字节:
write(1, "\33[M", 3) = 3
tput
复制时是否存在任何缺陷在实现延迟的情况下,通过传输pad字符(传统上是NUL字符)来实现。pad字符可以通过变量pad或pc的termdata/terminfo设置来更改 Pad字符是必需的,因为程序无法知道之前发送的字符何时被实际写入以启动CPU延迟。即使内核在输出刷新后处理完这些字符,这些字符仍可能被缓冲在输出设备UART中 所需的pad字符数是根据波特率计算的,因此它取决于可用的信息和准确的信息
库中的tputs例程实现填充(参见man 3 tputs)。我怀疑命令行工具也会这样做,因为它基本上只是一个包装器。在实现延迟的地方,它是通过传输pad字符来完成的,传统上是NUL字符。pad字符可以通过变量pad或pc的termdata/terminfo设置来更改 Pad字符是必需的,因为程序无法知道之前发送的字符何时被实际写入以启动CPU延迟。即使内核在输出刷新后处理完这些字符,这些字符仍可能被缓冲在输出设备UART中 所需的pad字符数是根据波特率计算的,因此它取决于可用的信息和准确的信息
库中的tputs例程实现了填充(请参见man 3 tputs)。我怀疑命令行工具也实现了填充,因为它基本上只是一个包装器。同意@cliffordheath的观点,即填充是通过添加填充字符来完成的,参考可用的文档可以有所帮助 硬件终端并没有停止存在,它们仍然存在。如果没有填充,这些旧终端将无法正常工作(丢失或损坏输出)。
vt100
条目使用填充,而对于xterm
则不使用填充
填充字符的terminfo名称是pad
;pc
是termcap名称(请参阅):
terminfo手册页面有一个很长的段落(in)处理填充。terminfo格式支持两种填充(建议和强制),根据其格式进行区分。termcap只支持后者(当然使用不同的语法),与terminfo不同,所有延迟都是一次发生的(为“闪光”设置转义序列通常不起作用)
命令行程序不仅仅是作为函数的包装器,而是在输出字符串时使用它。命令行程序提供了输出布尔值、数值以及当然还有字符串的功能
库调用tputs
有一个参数,用于计算延迟时考虑的受影响行数(如波特率)
在OP的问题中
dl1=\E[M$<5*/>
dl1=\E[M$
指定与受影响的行数成比例的延迟(由“*”
字符标记)。命令行tput
实用程序受影响的行数为1。它为此调用。但是,该实用程序依次调用,并且该实用程序调用。最后一个函数仅在终端初始化时初始化。命令行tput
不会初始化终端,因此延迟对此不起作用。您应该看到(给定正确的速度)延迟使用库本身
ncurses还提供以毫秒为单位的时间延迟,这与填充不同。同意@cliffordheath的观点,即填充是通过添加填充字符来完成的,参考可用文档会有所帮助 硬件终端并没有停止存在,它们仍然存在。如果没有填充,这些旧终端将无法正常工作(丢失或损坏输出)。
vt100
条目使用填充,而对于xterm
则不使用填充
填充字符的terminfo名称是pad
;pc
是termcap名称(请参阅):
terminfo手册页面有一个很长的段落(in)处理填充。terminfo格式支持两种填充(建议和强制),根据其格式进行区分。termcap只支持后者(当然使用不同的语法),与terminfo不同,所有延迟都是一次发生的(为“闪光”设置转义序列通常不起作用)
命令行程序不仅仅是作为函数的包装器,而是在输出字符串时使用它。命令行程序提供了输出布尔值、数值以及当然还有字符串的功能
库调用tputs
有一个参数,用于计算延迟时考虑的受影响行数(如波特率)
在OP的问题中
dl1=\E[M$<5*/>
dl1=\E[M$
指定与受影响的行数成比例的延迟(由“*”
字符标记)。命令行tput
实用程序受影响的行数为1。它为此调用。Howe