2009-03-31 5 views
9

Je veux trouver des API C/C++ de bas niveau, équivalentes à "écrire" dans les systèmes Linux, qui n'ont pas de tampon. Est-ce qu'il y a un?Y a-t-il une E/S non bufferisée dans le système Windows?

Les E/S tamponnées telles que fread, fwrite ne sont pas ce que je voulais.

+0

Est-ce pour éviter le cache disque, ou pour éviter le type de tampon qui interfère avec les tuyaux et/ou examine la sortie telle qu'elle est écrite? –

Répondre

14

Look at CreateFile avec l'option FILE_FLAG_NO_BUFFERING

+0

Ce n'est pas la même chose. WriteFile() dans Windows, par défaut, est déjà comme write() sous Linux. Les deux laisseront le système d'exploitation tamponner les pages sales avant qu'ils soient vidés sur le disque. De même, l'utilisation de la fonction fwrite sur Windows ou Linux permet également de mettre en mémoire tampon de petits blocs dans l'espace utilisateur. Donc fwrite() sur Windows ou LInux a une double couche de tampons. WriteFile() sur Windows a par défaut une seule couche de mise en mémoire tampon dans le système d'exploitation, sauf si vous spécifiez également FILE_FLAG_NO_BUFFERING, ce qui désactive la mise en mémoire tampon du système d'exploitation. Il n'y a pas d'équivalent à FILE_FLAG_NO_BUFFERING sous Linux AFAIK. – Wheezil

+0

La réponse courte est, en utilisant WriteFile() est équivalent à write() sur Linux. – Wheezil

2

les flux sont à peu près aussi bas que vous pouvez obtenir .. et ils peuvent être unbuffered.

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

exemple

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

est ici un extrait du document d'aide VC2008.

La fonction setvbuf permet au programme de contrôler à la fois la mise en mémoire tampon et la taille de la mémoire tampon pour le flux. stream doit faire référence à un fichier ouvert qui n'a pas subi d'opération d'E/S depuis son ouverture. Le tableau pointé par buffer est utilisé comme tampon, à moins qu'il ne soit NULL, auquel cas setvbuf utilise un tampon alloué automatiquement de longueur/2 * 2 octets.

Le mode doit être _IOFBF, _IOLBF ou _IONBF. Si le mode est _IOFBF ou _IOLBF, la taille est utilisée comme taille du tampon. Si le mode est _IONBF, le flux n'est pas tamponné et la taille et le tampon sont ignorés. Les valeurs pour le mode et leurs significations sont les suivantes:

_IOFBF Tampon complet; c'est-à-dire que le tampon est utilisé comme tampon et que la taille est utilisée comme taille du tampon. Si le tampon est NULL, une taille de tampon allouée automatiquement est utilisée.

_IOLBF Pour certains systèmes, cela fournit une mise en mémoire tampon de ligne. Cependant, pour Win32, le comportement est le même que _IOFBF - Full Buffering.

_IONBF Aucun tampon n'est utilisé, quel que soit le tampon ou la taille.

+1

Je crois que c'est la mise en mémoire tampon dans les bibliothèques C. Cela n'influence pas le niveau de système d'exploitation ou la mise en mémoire tampon au niveau matériel. –

4

La fonction d'équivalence Win32 de l'écriture de POSIX() est WriteFile(). La documentation recommande d'utiliser des E/S de fichiers non tamponnés et recommande this page pour plus d'informations.

5

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

La seule méthode pour empêcher l'échange sur le cache est d'ouvrir des fichiers avec le drapeau FILE_FLAG_NO_BUFFERING. Ceci, cependant, nécessite que les tailles des tailles des secteurs soient divisées par les demandes d'E/S de disque (512 à 4096 octets), ce qui nécessiterait des réécritures importantes de la plupart des applications qui demandent des tailles différentes.

Ce projet contient une enveloppe de drop-in qui offre les CreateFile_NB(), ReadFile_NB(), WriteFile_NB() et CloseHandle_NB() fonctions qui prennent soin de faire la queue et d'ajuster la taille du fichier lors de la fermeture d'un fichier ouvert pour l'écriture.

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

Lors de l'ouverture ou de la création d'un fichier avec la fonction CreateFile, le drapeau FILE_FLAG_NO_BUFFERING peut être spécifié pour désactiver la mise en cache du système des données sont lues ou écrites dans le fichier. Bien que cela donne un contrôle complet et direct sur la mise en mémoire tampon des E/S de données, dans le cas de fichiers et de périphériques similaires, des exigences d'alignement des données doivent être prises en compte.

Questions connexes