Voglio trovare API C/C++ di basso livello, equivalenti a "write" in sistemi Linux, che non hanno un buffer. Ce n'è uno?C'è un I/O senza buffer nel sistema Windows?
L'I/O bufferizzato come fread, fwrite non è quello che volevo.
Voglio trovare API C/C++ di basso livello, equivalenti a "write" in sistemi Linux, che non hanno un buffer. Ce n'è uno?C'è un I/O senza buffer nel sistema Windows?
L'I/O bufferizzato come fread, fwrite non è quello che volevo.
Guardate CreateFile con l'opzione FILE_FLAG_NO_BUFFERING
Questa non è la stessa cosa. WriteFile() in Windows, per impostazione predefinita, è già come write() su Linux. Entrambi consentiranno al sistema operativo di bufferizzare le pagine sporche prima che vengano scaricate sul disco. Allo stesso modo, l'uso della funzione fwrite su Windows o Linux buffererà anche piccoli blocchi nello spazio utente. Quindi fwrite() su Windows o LInux ha un doppio livello di buffer. WriteFile() su Windows di default ha un singolo livello di buffering nel sistema operativo, a meno che non si specifichi anche FILE_FLAG_NO_BUFFERING, che disabilita il buffering del sistema operativo. Non esiste alcun equivalente a FILE_FLAG_NO_BUFFERING in Linux AFAIK. – Wheezil
La risposta breve è, usando WriteFile() è equivalente a write() su Linux. – Wheezil
i flussi sono di livello inferiore a quello che è possibile ottenere .. e possono essere unbuffered.
int setvbuf( FILE *stream, char *buffer, int mode, size_t size );
esempio
setvbuf(stdout, (char *)NULL, _IONBF, 0); //unbuffered stdout
Ecco un estratto dal documento VC2008 aiuto.
La funzione setvbuf consente al programma di controllare sia il buffer che la dimensione del buffer per lo streaming. lo stream deve fare riferimento a un file aperto che non ha subito un'operazione di I/O da quando è stato aperto. L'array a cui fa riferimento il buffer viene utilizzato come buffer, a meno che non sia NULL, nel qual caso setvbuf utilizza un buffer assegnato automaticamente di lunghezza/2 * 2 byte.
La modalità deve essere _IOFBF, _IOLBF, o _IONBF. Se la modalità è _IOFBF o _IOLBF, la dimensione viene utilizzata come dimensione del buffer. Se la modalità è _IONBF, il flusso non viene bloccato e le dimensioni e il buffer vengono ignorati. I valori per la modalità e i loro significati sono:
_IOFBF Buffering completo; cioè, il buffer viene utilizzato come buffer e la dimensione viene utilizzata come dimensione del buffer. Se il buffer è NULL, viene utilizzato un byte della dimensione del buffer allocata automaticamente.
_IOLBF Per alcuni sistemi, questo fornisce il buffering di linea. Tuttavia, per Win32, il comportamento è lo stesso di _IOFBF - Full Buffering.
_IONBF Nessun buffer utilizzato, indipendentemente dal buffer o dalle dimensioni.
Questo credo sia il buffering nelle librerie C. Non influenza il livello del sistema operativo o il buffering del livello hardware. –
L'equivalenza Win32 della scrittura POSIX() è WriteFile()
. La documentazione consiglia di utilizzare I/O di file non bufferizzati e raccomanda this page per ulteriori informazioni.
È possibile utilizzare _write
MSDN Page Here.
http://www.codeproject.com/Articles/51678/Improve-responsiveness-in-Windows-with-the-FILE_FL
L'unico metodo per evitare che sostituendo la cache è quello di aprire i file con il flag FILE_FLAG_NO_BUFFERING
. Ciò, tuttavia, richiede che le richieste di I/O su disco abbiano dimensioni divisibili per dimensione di settore (da 512 a 4096 byte), il che richiederebbe riscritture di grandi dimensioni per la maggior parte delle applicazioni che si basano sulla possibilità di richiedere dimensioni diverse.
Questo progetto contiene un wrapper drop-in che offre i CreateFile_NB()
, ReadFile_NB()
, WriteFile_NB()
, e CloseHandle_NB()
funzioni che si occupano di fare la coda e la regolazione della dimensione del file quando si chiude un file aperto in scrittura.
http://msdn.microsoft.com/en-us/library/cc644950(v=vs.85).aspx
Quando si apre o si crea un file con la funzione CreateFile, può essere specificato il flag FILE_FLAG_NO_BUFFERING
per disattivare sistema di cache di dati che vengono letti o scritti al file. Sebbene ciò dia un controllo completo e diretto sul buffering I/O dei dati, nel caso di file e dispositivi simili ci sono requisiti di allineamento dei dati che devono essere considerati.
È questo per evitare la cache del disco o per evitare il tipo di buffering che interferisce con le pipe e/o esaminare l'output come è scritto? –