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

hgtggwj0  于 8个月前  发布在  Unix
关注(0)|答案(2)|浏览(64)

我一直在看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复制它有什么缺陷吗?

q3qa4bjr

q3qa4bjr1#

与@cliffordheath讨论填充是通过添加填充字符来完成的,参考可用的文档可以有所帮助。
硬件终端并没有停止存在,它们仍然受到ncurses的支持。如果没有填充,这些旧的终端将无法正常工作(丢弃或损坏输出)。vt100条目使用填充,而xterm则没有。
填充字符的 terminfo 名称为**pad;pc**是一个termcap名称(参见terminfo(5)):

pad_char                  pad    pc   padding char
                                         (instead of null)

terminfo手册页有一个很长的段落(在 Types of Capabilities 中)处理填充。Terminfo格式支持两种类型的填充(advisorymandatory),按格式区分。termcap只支持后者(当然使用了不同的语法),并且与terminfo不同,所有的延迟都是一次发生的(使得“flash”的转义序列通常不起作用)。
命令行tput程序不仅仅充当函数tputs的 Package 器,而且在输出字符串时使用 Package 器。命令行程序提供了输出布尔值、数字和字符串的功能。
库调用tputs有一个参数,表示在计算延迟时要考虑的受影响的行数(如波特率)。
关于OP的问题

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

指定与受影响的行数成比例的延迟(由"*"字符标记)。* 命令行 * tput实用程序受影响的行数为1。它调用putp来完成此操作。但是,这又调用了delay_output,而delay_output调用了波特率。最后一个函数仅在终端初始化时初始化。命令行tput并不初始化终端,所以延迟对 that 不起作用。你应该看到(在正确的速度下)使用库本身的延迟。
ncurses还提供napms(毫秒)的时间延迟,这与填充不同。

kmynzznz

kmynzznz2#

在实现延迟的地方,它是通过传输填充字符(传统上是NUL字符)来实现的。pad字符可以通过变量 padpc 的termdata/terminfo设置来更改。
填充字符是必要的,因为程序无法知道以前发送的字符实际上何时被写入以启动CPU延迟。即使内核在输出刷新后处理完它们,字符仍然可能在输出设备中缓冲。
所需的填充字符数是根据波特率计算的-因此它取决于该信息的可用性和准确性。
库中的tputs例程实现了填充(参见 man 3 tputs)。我怀疑命令行工具也是如此,因为它基本上只是一个 Package 器。

相关问题