屏幕处理程序(eg.vi, less) 是如何工作的?

How screen handling program(eg.vi, less) work?

假设我正在用 vi 阅读文档。当我到达屏幕末尾并按下箭头键时,终端中会打印一个包含下一行内容的新屏幕。

我想知道这个过程是如何实现的。

vi 进程是否引发 SIGTSTP 并调用信号处理程序以使用包括下一行的新屏幕继续该进程?

Is ... process raise SIGTSTP and call signal handler ...

没有

程序首先执行一个tcsetattr()(它在内部执行一个特殊的ioctl())所以键盘输入不是按行处理而是按键处理。

然后它打印出 25 行。

现在它只使用 read() 等待按键。

如果您按下 DOWN 键,则会多打印一行。

如果按UP键(在less的情况下),就有点棘手了;根据使用的终端,一些“转义序列”(字节的特殊组合)使用 write() 写入屏幕。这将导致屏幕向下滚动。然后写入另一个“转义序列”,将光标置于屏幕左上角,并在屏幕顶​​部打印一行文本。

完成后,程序使用 read() ...

等待下一个键

不涉及信号。