Vider ou "vider" un descripteur de fichier sans read ()?
(Note: Ceci est pas une question de comment vider les write()
. C'est le autre extrémitépour ainsi dire.)
Est-il possible de vider un descripteur de fichier qui a des données à lire en elle sans avoir à read()
? Vous pourriez ne pas être intéressés par les données, et la lecture de tout cela ne serait donc perdre de l'espace et des cycles vous pourriez avoir plus de utilise pour.
Si il n'est pas possible dans POSIX, faire tous les systèmes d'exploitation qui n'est pas portable façons de le faire?
Mise à JOUR: Veuillez noter que je parle les descripteurs de fichierpas ruisseaux.
source d'informationauteur Teddy | 2009-12-17
Vous devez vous connecter pour publier un commentaire.
Ruisseaux fclean disponibles, ce qui vide le tampon d'écriture, et renvoie la mémoire tampon de lecture arrière de l'e /s du système.
http://www.gnu.org/software/hello/manual/libc/Cleaning-Streams.html
Si vraiment ce que vous voulez faire est de sauter octets, de repositionner le pointeur de fichier est l'action correcte. Il suffit de sauter en avant, comme le nombre d'octets que vous ne voulez pas lire.
http://www.gnu.org/software/hello/manual/libc/File-Position-Primitive.html#File-Position-Primitive
Si vous avez affaire à un atsjetez un oeil à
tcflush()
:http://opengroup.org/onlinepubs/007908775/xsh/tcflush.html
De POSIX, utilisez
lseek(2)
oulseek64(3)
à demander à l'avance. Pour Windows, utilisezSetFilePointer()
ouSetFilePointerEx()
.Ni lire() ni flush() font partie du Standard C ou C++, mais certainement pas les fonctions standard de support de rinçage du flux d'entrée. Je suppose que cela reflète quelque chose de pas disponible dans le sous-jacentes des systèmes d'exploitation. La voie normale pour éviter de lire quelque chose de complètement est de sauter par-dessus avec un seek() la fonction de quelque sorte.
Si vous connaissez le nombre d'octets à sauter, vous pouvez le faire
lseek(fd, n, SEEK_CUR);
pour les systèmes POSIX. Il estfseek()
ainsi, pourFILE *
objets. Dans POSIX, je pense que vous pouvez en toute sécurité à chercher après la fin du fichier, l'idée est que si d'autres données sont écrites plus tard, afin de rendre les données aller au-delà de la position définie aveclseek()
vous serez capable de lire plus de données maintenant.Selon cetteun système POSIX va ce faire sur
fflush(stream);
.Linux 2.6.17 ou plus tard avec la bibliothèque C de GNU version 2.5 ou plus tard contenir les
splice()
appel système, qui peut être utilisé pour envoyer des données à partir d'un descripteur de fichier à un autre sans la copier à l'espace utilisateur. Cela peut être utilisé pour rejeter les données en ouvrant simplement/dev/null
etsplice
ing données à partir de la source descripteur de fichier dans le/dev/null
descripteur de fichier.