簡體   English   中英

在c中使用setvbuf()函數有什么意義?

[英]what is the point of using the setvbuf() function in c?

您為什么要在setvbuf()預留一塊內存?

我不知道您為什么要將讀/寫流發送到緩沖區。

setvbuf並非旨在將輸出重定向到緩沖區(如果要在緩沖區上執行IO,請使用sprintf &co。),而是嚴格控制給定流的緩沖行為。

實際上,C IO函數不會立即將要寫入的數據傳遞給操作系統,而是保留一個中間緩沖區,以避免連續執行(可能代價很高)系統調用,並在實際執行寫操作之前等待緩沖區填滿。

最基本的情況是完全禁用緩沖(例如,如果寫入日志文件,則希望在每次輸出操作后將數據立即存入磁盤),或者在啟用流的塊上啟用塊緩沖默認禁用(或設置為行緩沖)。 這可能有助於增強輸出性能。

如果您正在使用已知可以在特定緩沖區大小下正常工作的設備,則設置用於輸出的特定緩沖區會很有用; 另一方面,您可能希望有一個較小的緩沖區來減少內存受限環境中的內存使用量,或者避免在斷電的情況下丟失大量數據而不完全禁用緩沖區。

在默認情況下,在用例如fopen C文件中緩沖文件。 您可以使用setvbuf提供您自己的緩沖區,或者使文件操作完全無緩沖(就像stderr一樣)。

它可以用來在不具有fmemopen功能的系統上創建該功能。

文件緩沖區的大小可能會影響標准庫調用I / O速率。 史蒂文的“ UNIX環境中的高級編程”的第5章中有一張表,該表顯示了I / O吞吐量隨着I / O緩沖區大小的增加而急劇增加,直到〜16K才穩定下來。 許多其他因素也會影響總體I / O吞吐量,因此,這一“調整”影響可能會或可能不會治愈。 除了關閉/打開緩沖之外,這是“為什么”的主要原因。

每個FILE結構內部都有一個與其關聯的緩沖區。 其背后的原因是減少I / O,而實際的I / O操作會花費大量時間。 您所有的讀/寫操作都將被緩沖,直到緩沖區已滿。 所有緩沖的數據將通過一個實際的I / O操作輸出/輸入。

您為什么要在setvbuf()中預留一塊內存?

用於緩沖。

我不知道您為什么要將讀/寫流發送到緩沖區。

我也沒有,但是那不是事實,這很重要。

“ setvbuf()函數可用於任何打開的流以更改其緩沖區” [我的重點]。 換句話說,它已經有一個緩沖區,而所有功能所做的就是更改它。 它並沒有說明“將讀取/寫入流發送到緩沖區”。我建議您閱讀手冊頁以了解其實際含義。尤其是以下部分:

當輸出流未緩沖時,信息將在寫入后立即出現在目標文件或終端上。 當它被塊緩沖時,許多字符被保存起來並寫成一個塊; 當是行緩沖字符時,將保存這些字符,直到從連接到終端設備的任何流(通常為stdin)輸出換行符或讀取換行符為止。

暫無
暫無

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

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