Primo, fsync()
(e sync()
) sono funzioni standard POSIX mentre syncfs()
è solo per Linux.
Quindi la disponibilità è una grande differenza.
Dallo standard POSIX per fsync()
:
Il
fsync()
la funzione deve richiedere che tutti i dati per il descrittore di file aperto denominato dafildes
deve essere trasferito al dispositivo di archiviazione associato al file descritto dafildes
. La natura del trasferimento è definita dall'implementazione. Ilfsync()
la funzione non deve tornare finché il sistema non ha completato l'azione o finché non viene rilevato un errore.
Nota che è solo una richiesta.
Dallo standard POSIX per sync()
:
Il
sync()
La funzione farà in modo che tutte le informazioni in memoria che aggiornano i file system siano pianificate per la scrittura su tutti i filesystem.La scrittura, sebbene pianificata, non è necessariamente completa al ritorno da
sync()
.
Ancora una volta, non è garantito che ciò accada.
La pagina man di Linux per syncfs()
(e sync()
) dichiara
sync()
fa in modo che tutte le modifiche in sospeso ai metadati del filesystem e ai dati dei file memorizzati nella cache vengano scritti nei filesystem sottostanti.
syncfs()
è comesync()
, ma sincronizza solo il file system contenente il file indicato dal descrittore di file apertofd
.
Nota che quando la funzione restituita non è specificata.
Il Linux pagina man per fsync()
afferma:
fsync()
trasferisce ("svuota") tutti i dati in-core modificati di (ovvero, pagine di cache buffer modificate per) il file a cui fa riferimento il descrittore di filefd
al dispositivo disco (o altro dispositivo di archiviazione permanente) in modo che tutte le informazioni modificate possano essere recuperate anche se il sistema si arresta in modo anomalo o viene riavviato. Ciò include la scrittura o lo svuotamento della cache di un disco, se presente. La chiamata viene bloccata finché il dispositivo non segnala che il trasferimento è stato completato.Oltre a svuotare i dati del file,
fsync()
scarica anche le informazioni sui metadati associate al file (vedi inode(7)).Chiamando
fsync()
non garantisce necessariamente che anche la voce nella directory contenente il file abbia raggiunto il disco. Per questo un esplicitofsync()
è necessario anche un descrittore di file per la directory.
Si noti che le garanzie fornite da Linux per fsync()
sono molto più forti di quelli forniti per sync()
o syncfs()
, e da POSIX per entrambi fsync()
e sync()
.
In sintesi:
- POSIX
fsync()
:"per favore scrivi i dati per questo file su disco" - POSIX
sync()
:"scrivi tutti i dati su disco quando ci riesci" - Linux
sync()
:"scrivi tutti i dati su disco (quando ci riesci?)" - Linux
syncfs()
:"scrivi tutti i dati per il filesystem associato a questo file su disco (quando ci arrivi?)" - Linux
fsync()
:"scrivi tutti i dati e i metadati per questo file su disco e non tornare finché non lo fai"
Si noti che la pagina man di Linux non specifica quando sync()
e syncfs()
ritorno.
Penso che la risposta attuale non sia completa. Per Linux:
Secondo le specifiche standard (ad esempio, POSIX.1-2001),
sync()
pianifica le scritture, ma può tornare prima che la scrittura effettiva sia terminata. Tuttavia Linux attende il completamento dell'I/O, e quindisync()
osyncfs()
fornire le stesse garanzie difsync
chiamato rispettivamente su ogni file nel sistema o nel filesystem.
e
Prima della versione 1.3.20 Linux non attendeva il completamento dell'I/O prima di tornare.
Questo è menzionato nel sync(2)
pagina nelle sezioni "note" e "bug".