我有一个命令,可以从服务器流式传输数据并将行写入stdout
.我想通过管道传输大量记录less
,但我想阻止我的工具继续传输数据,直到用户转到下一页,否则该工具将继续下载大量数据,而用户尚未查看它。
是否less
阻止输入进程写入标准输出,直到用户进入下一页,或者是否less
尝试在某处缓冲整个输入?
less
如果是后者,是否可以通过标志或代码中的一些实现细节将行为更改为前者,或者我是否需要实现自己的分页系统?
答案1
Less 懒惰地读取它的输入。它只读取需要的内容。如果输入是管道,则写入管道的程序一旦填满管道的固定大小缓冲区(通常为 512B 到几 kB),最终将被阻塞。
当用户使用需要到达文件末尾的命令(例如>
搜索或不成功的搜索)时,惰性就会停止。为了满足这样的请求,less 必须读取直到文件末尾。如果输入是无限的(因为写入管道的程序会永远写入),则请求将永远不会完成。
如果命令花费太长时间,用户可以使用 中断它Ctrl+C。这会导致 less 关闭输入,这又意味着如果管道缓冲区已满,写入管道的程序将收到 SIGPIPE 信号。使用 中断后Ctrl+C,如果输入来自管道,则无法恢复读取输入。