2011-12-14 71 views
3

printf()(或通常寫入stdout)如何處理流控制和緩衝?是否printf()保證在合理的時間內返回,還是會阻塞,直到它實際上能夠寫入stdout爲止?可以調用printf()塊嗎?

我在想一個很慢的SSH連接或類似的東西。這實際上可以減慢一些printf()程序?會立即發生,還是僅在某個緩衝區被填滿之後(stdout的一些內部緩衝區,或者甚至可能是TCP發送緩衝區)?除了可能增加延遲和降低輸出速度之外,使用SSH還會有其他的區別嗎?

如果是這樣,那是怎麼迴避的?線程是這個問題的常見解決方案,還是有更簡單的方法來設置一個標誌或做一個調用來切換標準輸出爲「非阻塞模式」?或者我有關於Unix I/O的工作的一些基本事實完全錯誤,這個問題沒有任何意義? :)

我要求主要是出於興趣,但隨着C和殼實驗過程中問題最近想出了兩次,我不知道在何處以及如何一般應解決:

  • 在開發可能爲了調試或信息目的而向終端輸出大量輸出的應用程序時,終端速度可能會變慢導致性能問題?我應該(作爲程序員)避免構造大型列表(對於y中的每個x:print y)嗎?

  • 或者,應該由應用程序用戶而不是開發人員通過將輸出重定向到文件等來最好地處理這個問題?如果是這樣,是否有任何有用的shell成語來解耦程序輸出與實際執行,如mytool | cat(我不確定這個特定的例子是否會改變任何事情,但貓可以被更復雜的東西取代)。

回答

3

是的,致電printf()可能會阻止。一個例子是stdout連接到另一端具有慢速讀取器的管道。

無論這是一個問題還是如何最好地緩解它真的取決於應用程序的性質,並且爲什麼這首先是一個問題。

+0

它主要是出於興趣,由一些C和輸入/輸出重定向的實驗動機。我在我的問題中加了這個。 – lxgr 2011-12-14 18:34:36