Linux
cat 是否使用惰性評估?
例如使用管道時
sudo cat /dev/sda | strings | less
我可以在我的 sda 設備的字元串中移動。但是 sda 設備的內容是否已完全載入並輸出到 cat 的輸出流中?還是在程序請求 cat 輸出時評估新行?(即我在較少的尋呼機上按 j )
這更多地與如何
less
工作有關,而不是與如何cat
或strings
工作有關。該
cat
命令只會將數據推送到其標準輸出,並且只要它之間的管道緩衝區strings
已滿且沒有人讀取,它將阻塞。cat
自己做最小的緩衝,管道緩衝區通常很小。對於
strings
. 它將處理來自的數據,並在不讀取產生的數據cat
時阻塞。less``strings
less
將緩衝其輸入以允許您在其顯示的數據中來回移動。當您滾動到下一頁時,less
將從strings
其緩衝區中讀取更多數據。當您不向前滾動時,我相信less
只會讀取有限數量的數據(因此在您不向前滾動時會被阻止)strings
。cat
如果您將大量數據通過管道傳輸到
less
,如果您決定使用less
.有一個選項 ,
-B
它將用於緩衝的記憶體量限制為 64 KB(或者您使用該-b
選項指定的大小)。以這種方式限制緩衝區大小將防止您向後滾動超過指定緩衝區空間中可以儲存的內容,但也允許您讀取大量數據而less
不會耗盡記憶體。另請參閱
man less
您的系統。
管道的緩衝區空間有限,如果管道讀取器(例如
less
在您的範例中)沒有從管道讀取更多數據,則寫入器將在填充緩衝區後被阻塞。這將影響strings
命令,而命令又會cat
在其管道已滿後阻塞該命令。自然,該
cat
命令無法將整個 sda 設備內容讀入主記憶體,因此如果尚未被它讀取的塊正在更改,cat
則會看到更改的內容。