屏幕处理程序(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()
...
等待下一个键
不涉及信号。
假设我正在用 vi 阅读文档。当我到达屏幕末尾并按下箭头键时,终端中会打印一个包含下一行内容的新屏幕。
我想知道这个过程是如何实现的。
vi 进程是否引发 SIGTSTP 并调用信号处理程序以使用包括下一行的新屏幕继续该进程?
Is ... process raise SIGTSTP and call signal handler ...
没有
程序首先执行一个tcsetattr()
(它在内部执行一个特殊的ioctl()
)所以键盘输入不是按行处理而是按键处理。
然后它打印出 25 行。
现在它只使用 read()
等待按键。
如果您按下 DOWN
键,则会多打印一行。
如果按UP
键(在less
的情况下),就有点棘手了;根据使用的终端,一些“转义序列”(字节的特殊组合)使用 write()
写入屏幕。这将导致屏幕向下滚动。然后写入另一个“转义序列”,将光标置于屏幕左上角,并在屏幕顶部打印一行文本。
完成后,程序使用 read()
...
不涉及信号。