Quando chiamiamo close(<fd>)
, fa automaticamente il fsync()
per la sincronizzazione con il supporto fisico?fa close() chiama fsync() su Linux?
risposta
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).
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.)
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.
Chiamare 'fsync()' * non *, per gli stessi motivi (l'hardware potrebbe rinviare le scritture). –
@ 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)? –
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. –