2013-03-02 112 views
2

例如puts()調用系統調用write()。 這是否意味着每次我們撥打puts()時它都會調用write(),或者在調用write()之前將累計值累加到某個緩衝區中?每次調用stdio函數都會導致系統調用嗎?

+0

如果你在屏幕上看到它,那麼它不會被緩衝。 – 2013-03-02 03:48:56

+1

不,'puts()並不總是調用系統調用。 Unix緩存輸出的C stdio庫,通常在(a)它進入終端時寫出緩衝區(系統調用),和(b)寫入新行(作爲puts(3))。如果stdout不是終端,它只是被緩存直到緩衝區已滿。 – vonbrand 2013-03-02 03:57:02

回答

2

你是對的 - 通常C FILE*流確實有存儲數據的緩衝區。只有在緩衝區已滿或流被關閉或調用了fflush時,它們纔會進行Unix I/O系統調用。您可以使用C標準功能setvbuf來控制流的緩衝。

3

stdio函數確實利用緩衝。在puts()這個特殊情況下,它總是寫一個完整的行到stdout,如果stdout連接到一個終端,那麼它通常會被行緩衝,所以每次撥打puts()都會導致write()的調用。

然而,可能有stdout被完全緩衝 - 或者使用setvbuf()通過運行與stdout程序連接到一個管道或文件(只要這之前的任何其它操作上stdout完成),或更常見。在這種情況下,每次撥打puts()時都不一定會致電write()

相關問題