Domanda

(Nota:.. Questo è non di una questione di come irrigare un write() Questo è il altra estremità di esso, per così dire)

E 'possibile svuotare un descrittore di file che contiene i dati da leggere in esso senza a dover read() esso? Potrebbe non essere interessati nei dati, e leggendo tutto sarebbe quindi spazio e cicli dei rifiuti si potrebbero avere usi migliori per.

Se non è possibile in POSIX, fare tutti i sistemi operativi hanno alcun modi non portatili per fare questo?

UPDATE:. Si prega di notare che sto parlando di descrittori di file , non stream

È stato utile?

Soluzione

Streams hanno fclean disponibili, che svuota il buffer di scrittura, e restituisce il buffer di lettura di nuovo al sistema IO.

http://www.gnu.org/software /hello/manual/libc/Cleaning-Streams.html

Se ciò che si vuole veramente fare è saltare byte, riposizionare il puntatore del file è l'azione corretta. Proprio saltate tanti byte come non si desidera leggere.

http: / /www.gnu.org/software/hello/manual/libc/File-Position-Primitive.html#File-Position-Primitive

Altri suggerimenti

Se hai a che fare con un tty , dare un'occhiata a tcflush():

#include <termios.h>
int tcflush(int fildes, int queue_selector);
  

In caso di superamento, tcflush ()   Dati scarta scritti all'oggetto   a cui si riferisce fildes (un file aperto   descrittore associato ad un terminale)   ma non trasmessi, o dati ricevuti   ma non di leggere, a seconda del valore   di queue_selector [...]

http://opengroup.org/onlinepubs/007908775/xsh/tcflush.html

Per POSIX, utilizzare lseek(2) o lseek64(3) a cercare avanti. Per Windows, utilizzare SetFilePointer() o SetFilePointerEx() .

né leggere (), né flush () fanno parte di standard C o C ++, ma certamente nessuna delle funzioni standard supportano risciacquo dei flussi in entrata. Direi questo riflette qualcosa non è disponibile nei sistemi operativi sottostanti. Il modo normale per evitare la lettura qualcosa complessivamente è di saltare con una funzione di sintonizzazione () di qualche tipo.

Se si conosce il numero di byte da saltare, si può fare lseek(fd, n, SEEK_CUR); per sistemi POSIX. C'è fseek() così, per gli oggetti FILE *. In POSIX, penso che si può chiedere in sicurezza oltre la fine del file, l'idea è che se più dati vengono scritti più tardi, in modo da rendere i dati andare oltre la posizione impostata con lseek(), si sarà in grado di leggere più dati ora.

questo , un sistema POSIX farà questo su fflush(stream);.

  

Per un flusso aperto per la lettura, se il file non è già a EOF, e il file è uno in grado di cercare, il file di offset della descrizione file aperto sottostante è regolata in modo che la prossima operazione sulla descrizione file aperto occupa il byte dopo l'ultima lettura o scritti nel flusso di essere lavata.

Linux 2.6.17 o versione successiva con la versione della libreria GNU C 2.5 o successiva contengono la chiamata di sistema splice(), che può essere utilizzato per inviare dati da un descrittore di file ad un altro senza copiarlo spazio utente . Questo può essere usato per scartare i dati semplicemente aprendo dati /dev/null e spliceing dal descrittore file sorgente nel descrittore di file /dev/null.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top