Linux

cat 是否使用惰性評估?

  • April 2, 2020

例如使用管道時

sudo cat /dev/sda | strings | less

我可以在我的 sda 設備的字元串中移動。但是 sda 設備的內容是否已完全載入並輸出到 cat 的輸出流中?還是在程序請求 cat 輸出時評估新行?(即我在較少的尋呼機上按 j )

這更多地與如何less工作有關,而不是與如何catstrings工作有關。

cat命令只會將數據推送到其標準輸出,並且只要它之間的管道緩衝區strings已滿且沒有人讀取,它將阻塞。 cat自己做最小的緩衝,管道緩衝區通常很小。

對於strings. 它將處理來自的數據,並在不讀取產生的數據cat時阻塞。less``strings

less將緩衝其輸入以允許您在其顯示的數據中來回移動。當您滾動到下一頁時,less將從strings其緩衝區中讀取更多數據。當您不向前滾動時,我相信less只會讀取有限數量的數據(因此在您不向前滾動時會被阻止)stringscat

如果您將大量數據通過管道傳輸到less如果您決定使用less.

有一個選項 ,-B它將用於緩衝的記憶體量限制為 64 KB(或者您使用該-b選項指定的大小)。以這種方式限制緩衝區大小將防止您向後滾動超過指定緩衝區空間中可以儲存的內容,但也允許您讀取大量數據而less不會耗盡記憶體。

另請參閱man less您的系統。

管道的緩衝區空間有限,如果管道讀取器(例如less在您的範例中)沒有從管道讀取更多數據,則寫入器將在填充緩衝區後被阻塞。這將影響strings命令,而命令又會cat在其管道已滿後阻塞該命令。

自然,該cat命令無法將整個 sda 設備內容讀入主記憶體,因此如果尚未被它讀取的塊正在更改,cat則會看到更改的內容。

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