簡體   English   中英

Perl STDOUT重定向到管道,調用sleep()后沒有輸出

[英]Perl STDOUT redirected to a pipe, no output after calling sleep()

我在使用Windows上的Perl(ActivePerl和Strawberry)時遇到問題,將腳本STDOUT重定向到管道,並使用sleep()。 試試這個:

perl -e "for (;;) { print 'Printing line ', $i++, \"\n\"; sleep(1); }"

這按預期工作。 現在將它傳遞給Tee(或一些文件,相同的結果):

perl -e "for (;;) { print 'Printing line ', $i++, \"\n\"; sleep(1); }" | tee

根本沒有輸出,發球沒什么。 但是,perl腳本仍在運行,只有在腳本完成之前STDOUT上沒有任何內容,然后所有輸出都被轉儲到tee。 除非,如果STDOUT緩沖區填充腳本可能會掛起。

現在,如果你刪除睡眠(調用),管道按預期工作! 這是怎么回事?

我找到了一個解決方法; 使用$ | = 1禁用STDOUT緩沖會使管道在使用睡眠時工作,但是......為什么? 誰能解釋並提供更好的解決方案?

你正在遭受緩沖。 添加$| = 1; $| = 1; 去緩沖STDOUT。

默認情況下,除STDERR之外的所有文件句柄都是緩沖的,但是當連接到終端時,STDOUT使用最小形式的緩沖(由換行符刷新)。 通過用終端代替管道,恢復正常緩沖。

刪除sleep呼叫不會改變任何事情,除非加快速度。 而不是花費幾分鍾來填充緩沖區,它需要幾毫秒。 無論有沒有,輸出仍然以4k或8k塊寫入(取決於您的Perl版本)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM