簡體   English   中英

Windows 系統中是否有無緩沖 I/O?

[英]Is there an un-buffered I/O in Windows system?

我想找到沒有緩沖區的低級 C/C++ API,相當於 linux 系統中的“寫入”。 有嗎?

fread、fwrite 等緩沖 I/O 不是我想要的。

使用 FILE_FLAG_NO_BUFFERING 選項查看CreateFile

http://www.codeproject.com/Articles/51678/Improve-responsiveness-in-Windows-with-the-FILE_FL

防止換出緩存的唯一方法是使用FILE_FLAG_NO_BUFFERING標志打開文件。 然而,這要求磁盤 I/O 請求的大小可以被扇區大小(512 到 4096 字節)整除,這需要對大多數依賴於能夠請求不同大小的應用程序進行大量重寫。

該項目包含一個插入式包裝器,該包裝器提供CreateFile_NB()ReadFile_NB()WriteFile_NB()CloseHandle_NB()函數,這些函數負責在關閉為寫入而打開的文件時進行排隊和調整文件大小。

http://msdn.microsoft.com/en-us/library/cc644950(v=vs.85).aspx

使用 CreateFile function 打開或創建文件時,可以指定FILE_FLAG_NO_BUFFERING標志來禁用從文件讀取或寫入文件的數據的系統緩存。 盡管這可以完全直接地控制數據 I/O 緩沖,但對於文件和類似設備,必須考慮數據 alignment 要求。

POSIX write() function 的 Win32 等效項是WriteFile() 該文檔建議使用非緩沖文件 I/O,並推薦此頁面以獲取更多信息。

流大約是您可以獲得的最低級別..並且它們可以是無緩沖的。

int setvbuf(
   FILE *stream,
   char *buffer,
   int mode,
   size_t size 
);

例子

  setvbuf(stdout, (char *)NULL, _IONBF, 0); //unbuffered stdout

這是 vc2008 幫助文檔的摘錄。

setvbuf function 允許程序控制 stream 的緩沖和緩沖區大小。 stream 必須引用自打開后未進行 I/O 操作的打開文件。 buffer 指向的數組被用作緩沖區,除非它是 NULL,在這種情況下 setvbuf 使用長度為 size/2 * 2 字節的自動分配的緩沖區。

模式必須是_IOFBF_IOLBF_IONBF 如果 mode 是_IOFBF_IOLBF ,則 size 用作緩沖區的大小。 如果模式為 _IONBF,則 stream 無緩沖,大小和緩沖區將被忽略。 mode 的值及其含義是:

_IOFBF全緩沖; 即buffer作為緩沖區,size作為緩沖區的大小。 如果緩沖區是 NULL,則使用自動分配的緩沖區大小字節長。

_IOLBF對於某些系統,這提供了行緩沖。 但是,對於 Win32,行為與 _IOFBF - Full Buffering 相同。

_IONBF不使用緩沖區,無論緩沖區或大小如何。

您可以使用_write MSDN Page Here

暫無
暫無

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

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