在 C 程式的最開始,我遇到了以下行:
setvbuf(stdout, NULL, _IONBF, 0);
由于我不知道這個setvbuf功能,我在這里查看了它的檔案。但是,在此行之后,在引數/模式部分:
_IONBF無緩沖:不使用緩沖。每個 I/O 操作都會盡快寫入。在這種情況下,緩沖區和大小引數將被忽略。
我仍然很困惑。如果這種模式忽略了一半的引數,那么這一行到底給程式帶來了什么?
uj5u.com熱心網友回復:
setvbuf(stdout, NULL, _IONBF, 0);請求流不使用任何緩沖。具體來說,在第三個引數中,_IONBF請求無緩沖。對于緩沖的流,此呼叫請求更改以使其無緩沖。
由于沒有緩沖區,流不需要緩沖區(在第二個引數中傳遞)或緩沖區的長度(在第四個引數中傳遞)。
如果第三個引數是_IOLBF或_IOFBF,則呼叫請求緩沖(分別為行緩沖或全緩沖),然后使用第二個和第四個引數。(它們可能仍然是NULL0 來請求setvbuf分配記憶體,或者它們可能有其他值來提供由呼叫者安排的緩沖區。)
uj5u.com熱心網友回復:
我仍然很困惑。如果這種模式忽略了一半的引數,那么這一行到底給程式帶來了什么?
緩沖 I/O 操作首先將資料放入緩沖區,然后當滿足一些條件時(例如特殊情況資料 - 像'\n'stdout,緩沖區大小達到特定閾值,呼叫特殊函式(緩沖區重繪 )等)資料正在發送緩沖區。
如果禁用緩沖區,則資料不會放入緩沖區,只能直接發送。它在許多情況下非常方便,例如當多個執行緒發送資料并且只使用一個緩沖區時,您可能會從兩者中獲得混合資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/364736.html
上一篇:在linux中查找CFLAGS和LDFLAGS等價物
下一篇:C中指標的地址是什么?
