例如puts()
調用系統調用write()
。 這是否意味着每次我們撥打puts()
時它都會調用write()
,或者在調用write()
之前將累計值累加到某個緩衝區中?每次調用stdio函數都會導致系統調用嗎?
2
A
回答
2
你是對的 - 通常C FILE*
流確實有存儲數據的緩衝區。只有在緩衝區已滿或流被關閉或調用了fflush
時,它們纔會進行Unix I/O系統調用。您可以使用C標準功能setvbuf
來控制流的緩衝。
3
stdio函數確實利用緩衝。在puts()
這個特殊情況下,它總是寫一個完整的行到stdout
,如果stdout
連接到一個終端,那麼它通常會被行緩衝,所以每次撥打puts()
都會導致write()
的調用。
然而,可能有stdout
被完全緩衝 - 或者使用setvbuf()
通過運行與stdout
程序連接到一個管道或文件(只要這之前的任何其它操作上stdout
完成),或更常見。在這種情況下,每次撥打puts()
時都不一定會致電write()
。
相關問題
- 1. 每次使用變量時,PHP函數都會被調用嗎?
- 2. pthread_atfork()多次調用導致fork()函數被多次調用後
- 3. 每次調用jquery函數時都會增加變量
- 4. 每次調用函數時都會增加一個Int?
- 5. 每次更新路由時都會調用一個函數vue.js
- 6. 每次調用JavaScript函數時都會啓動CSS動畫?
- 7. Android onUpgrade每次都會被調用
- 8. IAuthorizationFilter每次都不會調用
- 9. 爲什麼我每次調用webmethod時都會調用WebService構造函數?
- 10. 每次使用時都會調用/加載靜態字段嗎?
- 11. 系統調用vs函數調用
- 12. 系統調用導致分段錯誤
- 13. DBD :: Oracle導致系統調用損壞?
- 14. 系統調用lseek導致段錯誤
- 15. 每次都調用jQuery ajaxComplete?
- 16. adapter.notifyDataSetChanged()每次都會導致NullPointerException錯誤
- 17. 每次配置更改時,onRetainNonConfigurationInstance()都會調用嗎?
- 18. 每次訪問sessionscoped bean時都會調用方法嗎?
- 19. 每次調用方法時Func都會編譯嗎?
- 20. 通過NSURLConnection問題調用Webservice,每次都不會調用?
- 21. PHP - 在對象中調用函數會導致錯誤:'調用'
- 22. 所有的glfw函數都會調用錯誤回調嗎?
- 23. 如果variable = new Model。每次調用變量時都會調用新的函數嗎?
- 24. 在applicationDidBecomeActive中調用NSRunLoop方法會導致系統不響應
- 25. 這個getter在每次引用時都會調用數據庫嗎?
- 26. Mutex是否會調用系統調用?
- 27. 在WCF中使用ASP.NET會話=每次調用都會丟失
- 28. 每次調用函數時都生成相同的數字
- 29. 調用一組函數,每個函數都會收到一個回調
- 30. 多次調用RemoveFromSuperView會導致崩潰/錯誤嗎?
如果你在屏幕上看到它,那麼它不會被緩衝。 – 2013-03-02 03:48:56
不,'puts()並不總是調用系統調用。 Unix緩存輸出的C stdio庫,通常在(a)它進入終端時寫出緩衝區(系統調用),和(b)寫入新行(作爲puts(3))。如果stdout不是終端,它只是被緩存直到緩衝區已滿。 – vonbrand 2013-03-02 03:57:02