Linux 如何在TTYs中实现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)

我一直在查看terminfo,它在功能字符串中有延迟,例如,
$
。我试图通过在
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