簡體   English   中英

fwrite是非阻塞的嗎?

[英]Is fwrite non-blocking?

在調用fflush之前,我可以認為fwrite是=非阻塞寫入嗎? 如果沒有,為什么不呢?我有什么選擇?

fwrite() 可能會阻塞。 它通常使用最大長度的內部緩沖區。 當緩沖區變滿時,它將發送數據(內部緩沖區的全部或一部分)。

setbuf()setvbuf()函數使您可以更改緩沖區的最大長度,並實際提供緩沖區的塊,但是詳細信息取決於實現,因此您必須閱讀特定C庫的文檔。

從概念上講,如果要在所有情況下都保證無阻塞寫入,則需要潛在的無限緩沖區,這可能會有些昂貴。 您可以創建自己的函數來緩沖數據(在RAM塊內,在必要時使用realloc()使數據增長)並僅在最后寫出(使用fwrite()和可能的fflush() )。 或者,您可以嘗試使用非阻塞I / O,在該I / O中,寫函數從不阻塞,但可能會因內部擁塞而拒絕接受您的數據。 非阻塞I / O不是C標准本身的一部分(沒有f*()函數),但是可以在某些系統上以各種名稱找到(例如,在Unix系統上使用fcntl()write() ) 。

從技術上講fwrite()是一個阻塞調用,因為直到過程完成,它才返回。 但是, fwrite()的完成定義是,您提供的數據已被寫入內部文件緩沖區。 作為副作用,某些緩沖區也可能作為fwrite()調用的一部分寫入磁盤,但是您不能依賴該行為。 如果絕對需要將數據存儲在磁盤上,則需要調用fflush()

fwrite()正在阻止。 fwrite()可以隨時在內部調用fflush()。

如果只需要它來緩沖,則可以在自己的數組中緩沖。 fwrite的緩沖區通常為幾K。

暫無
暫無

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

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