Vuoto o “filo” un descrittore di file senza read ()?
-
20-09-2019 - |
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
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 [...]
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 splice
ing dal descrittore file sorgente nel descrittore di file /dev/null
.