Pipe

在使用者前進頁面之前,是否會阻止輸入過程寫入標準輸出?

  • December 6, 2021

我有一個命令,它從伺服器流式傳輸數據並將行寫入stdout. 我想通過管道傳輸大量記錄less,但我想阻止我的工具繼續流式傳輸數據,直到使用者轉到下一頁,否則該工具將繼續下載大量數據,而使用者尚未查看。

是否會less阻止輸入過程寫入標準輸出,直到使用者轉到下一頁,或者是否less嘗試在某處緩衝整個輸入?

如果是後者,是否可以通過less標誌或程式碼中的一些實現細節將行為更改為前者,還是我需要實現自己的分頁系統?

Less 懶惰地讀取它的輸入。它只讀取所需的內容。如果輸入是管道,寫入管道的程序一旦填滿管道的固定大小緩衝區(通常為 512B 到幾 kB),最終將阻塞。

當使用者使用需要到達文件末尾的命令(例如>搜尋不成功)時,惰性就會停止。為了滿足這樣的請求,less 必須讀取到文件末尾。如果輸入是無限的(因為寫入管道的程序一直在寫入),請求將永遠不會完成。

如果命令花費的時間太長,使用者可以使用 中斷它Ctrl+C。這會導致 less 關閉輸入,這反過來意味著如果管道緩衝區已滿,寫入管道的程序將收到 SIGPIPE 信號。中斷後Ctrl+C,如果輸入來自管道,則無法繼續讀取輸入。

引用自:https://unix.stackexchange.com/questions/680419