Io-Redirection

將管道輸出到頭/尾所需的時間

  • October 8, 2014

一個目錄中有很多txt文件。

如果我這樣做time wc -l *.txt | head需要

real    0m0.032s
user    0m0.020s
sys     0m0.008s

如果我這樣做time wc -l *.txt | tail需要

real    0m0.156s
user    0m0.076s
sys     0m0.088s

這是否意味著它wc會事先知道它正在流向頭部並且只會計算前 10 個文件並節省時間?換句話說,它知道管道嗎?這是特殊的wc東西還是適用於所有標準/內置命令?

strace對這兩個命令都做了一個。有趣的是,當您通過管道輸出時,head只有 123 個系統呼叫。另一方面,當管道傳輸到尾部時,系統呼叫有 245 個(當有更多 *.txt 文件時,系統呼叫會更多)。

案例:頭部

以下是管道傳輸到的最後幾行head

open("file12.txt", O_RDONLY)            = 3
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "", 16384)                      = 0
write(1, "0 file12.txt\n", 13)          = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0) ---
+++ killed by SIGPIPE +++

wc嘗試寫入第 12 個文件的輸出時,會出現錯誤EPIPE。這就是為什麼head在獲得第 11 行後退出的原因。head退出時,wc獲取SIGPIPE. 如上面的 strace 輸出所示,wc首先嘗試寫入該管道(head不再從中讀取)並收到管道損壞的錯誤。

SIGPIPE 信號在程序嘗試寫入管道而沒有連接到另一端的程序時被發送到程序。——來自維基百科

案例:尾巴

當管道傳輸到tail時,上面沒有類似的東西。wc 在將所有輸出寫入tail需要一直連接的管道後優雅地結束。tail需要所有行才能列印最後 10 行。當沒有更多輸出要讀取時,tail列印行並優雅退出

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