2013-03-11 9 views

risposta

9

Non funziona. Chiamare close() NON garantisce che i contenuti siano sul disco in quanto il sistema operativo potrebbe aver rinviato le scritture.

Come nota a margine, controllare sempre il valore restituito di close(). Ti farà sapere di eventuali errori rinviati fino a quel momento. E se vuoi assicurarti che i contenuti siano sul disco chiama sempre fsync() e controlla anche il suo valore di ritorno.

Una cosa da tenere a mente è il backing store. Ci sono dispositivi che possono eseguire differimenti di scrittura interni e il contenuto può essere perso in alcuni casi (anche se i nuovi dispositivi di archiviazione di solito dispongono di super condensatori per impedirlo, o modi per disabilitare questa funzione).

+0

Chiamare 'fsync()' * non *, per gli stessi motivi (l'hardware potrebbe rinviare le scritture). –

+0

@ FrédéricHamidi 'fsync()' impone le scritture all'archiviazione, in quali condizioni fsync non garantisce i contenuti sul disco (eccetto errori dispari e scritture differite hardware che in alcuni casi non possono essere controllati)? –

+0

Ci potrebbe essere (e di solito è) un altro livello di cache nel controller del disco, quindi anche 'fsync()' non può garantire che i dati siano stati apportati all'hardware effettivo. La [man page] (http://linux.die.net/man/2/close) per 'close()' lo menziona. –

1

No.

Da man 2 close

Un successo stretta non garantisce che i dati sono stati salvato con successo su disco, come il kernel rinvia scritture. È non è comune per un file system per svuotare i buffer quando il flusso viene chiuso. Se è necessario essere sicuri che i dati siano memorizzati nello stato fisico , utilizzare fsync (2). (Dipenderà l'hardware del disco, a questo punto.)

0

Da man 2 close:

Un successo stretta non garantisce che i dati sono stati salvato con successo su disco, come il kernel rinvia scrive . Non è comune per un file system per svuotare i buffer quando lo stream è chiuso. Se è necessario accertarsi che i dati siano archiviati fisicamente, utilizzare fsync (2). (Dipenderà sul disco hard-ware, a questo punto.)

Per rispondere alla tua domanda, NO, close() non garantisce fsync()

close chiude solo il descrittore di file per il processo e rimuove eventuali blocchi di record associati al processo.