2013-06-17 8 views

risposta

1

Nei file C aperti con ad es. fopen sono di default bufferizzati. È possibile utilizzare setvbuf per fornire il proprio buffer o rendere le operazioni sui file completamente non bufferizzate (come ad esempio stderr).

Può essere utilizzato per creare la funzionalità fmemopen su sistemi che non dispongono di tale funzione.

0

Le dimensioni di un buffer di file possono influire sulle tariffe I/O di chiamata della libreria standard. C'è una tabella nel Capitolo 5 della "Programmazione avanzata nell'ambiente UNIX" di Steven che mostra un throughput I/O che aumenta drammaticamente con la dimensione del buffer I/O, fino a ~ 16K e poi il livellamento. Un sacco di altri fattori possono influenzare il throughput complessivo di I/O, quindi questo effetto di "tuning" può essere o meno un cureall. Questo è il motivo principale del "perché" diverso dallo spegnimento/avvio del buffering.

5

setvbuf non intende reindirizzare l'output a un buffer (se si desidera eseguire IO su un buffer di utilizzare sprintf & co.), Ma strettamente controllare il comportamento del buffer stream specificato.

In fatti, funzioni C IO non passano immediatamente i dati da scrivere al sistema operativo, ma mantenere un buffer intermedio per evitare continuamente eseguire (potenzialmente costosi) chiamate di sistema, in attesa che il buffer di riempire prima di eseguire effettivamente la scrittura

Il caso più semplice è disabilitare completamente il buffering (utile ad es. Se si scrive su un file di log, dove si desidera che i dati vadano sul disco immediatamente dopo ogni operazione di output) o, d'altra parte, per attivare il buffering di blocco su flussi in cui è disabilitato per impostazione predefinita (o è impostato su buffer di linea). Questo può essere utile per migliorare le prestazioni in uscita.

impostando un buffer speciale per l'output può essere utile se si lavora con un dispositivo che è noto per lavorare bene con una dimensione di buffer specifica; dall'altro lato, si consiglia di avere un piccolo buffer per ridurre l'utilizzo della memoria in ambienti con memoria limitata, o per evitare di perdere molti dati in caso di perdita di potenza senza disabilitare completamente il buffering.

0

Ogni struttura FILE ha un buffer associato internamente. La ragione di ciò è ridurre l'I/O e le operazioni di I/O reali sono costose in termini di tempo. Tutte le tue letture/scritture verranno memorizzate nel buffer finché il buffer non è pieno. Tutti i dati bufferizzati verranno emessi/immessi in una vera operazione di I/O.

0

Perché si desidera mettere da parte un blocco di memoria in setvbuf()?

per il buffering.

Non ho idea del motivo per cui si desidera inviare il flusso di lettura/scrittura a un buffer.

Neanche io, ma poiché non è quello che fa il punto è discutibile.

"The setvbuf() function may be used on any open stream to change its buffer" [corsivo mio]. In altre parole, ha alread un buffer, e tutta la funzione fa è cambiare la situazione.Non dice nulla su 'invio di lettura/scrittura corsi d'acqua per un buffer" vi consiglio di leggere il uomo pagina per vedere che cosa in realtà dice Soprattutto questa parte:..

Quando un'uscita il flusso non è bloccato, le informazioni vengono visualizzate sul file o sul terminale di destinazione non appena vengono scritte, quando il buffer è bloccato, molti caratteri vengono salvati e scritti come un blocco, mentre i buffer di riga vengono salvati fino a quando non viene emesso un nuovo carattere o l'input è leggere da qualsiasi flusso collegato a un dispositivo terminale (in genere stdin)

Problemi correlati