Pertama, fsync()
(dan sync()
) adalah fungsi standar POSIX sementara syncfs()
hanya untuk Linux.
Jadi ketersediaan adalah salah satu perbedaan besar.
Dari standar POSIX untuk fsync()
:
fsync()
fungsi harus meminta bahwa semua data untuk filedescriptor terbuka dinamai denganfildes
akan ditransfer ke perangkat penyimpanan yang terkait dengan file yang dijelaskan olehfildes
. Sifat transfer ditentukan oleh implementasi.fsync()
fungsi tidak akan kembali hingga sistem menyelesaikan tindakan tersebut atau hingga kesalahan terdeteksi.
Perhatikan bahwa ini hanya permintaan.
Dari standar POSIX untuk sync()
:
sync()
fungsi akan menyebabkan semua informasi dalam memori yang memperbarui sistem file dijadwalkan untuk ditulis ke semua sistem file.Penulisan, meskipun dijadwalkan, belum tentu selesai setelah kembali dari
sync()
.
Sekali lagi, itu bukan sesuatu yang dijamin akan terjadi.
Halaman manual Linux untuk syncfs()
(dan sync()
) menyatakan
sync()
menyebabkan semua modifikasi tertunda pada metadata sistem file dan data file yang di-cache ditulis ke sistem file yang mendasarinya.
syncfs()
sepertisync()
, tetapi hanya menyinkronkan file yang berisi sistem file yang dirujuk oleh deskriptor file terbukafd
.
Perhatikan bahwa ketika pengembalian fungsi tidak ditentukan.
Linux halaman manual untuk fsync()
menyatakan:
fsync()
mentransfer ("flushes") semua data inti yang dimodifikasi dari (yaitu, halaman cache buffer yang dimodifikasi untuk) file yang dirujuk oleh filedescriptorfd
ke perangkat disk (atau perangkat penyimpanan permanen lainnya) sehingga semua informasi yang diubah dapat diambil bahkan jika sistem macet atau di-boot ulang. Ini termasuk menulis melalui atau membilas cache disk jika ada. Panggilan diblokir hingga perangkat melaporkan bahwa transfer telah selesai.Serta membilas data file,
fsync()
juga menghapus informasi metadata yang terkait dengan file (lihat inode(7)).Memanggil
fsync()
tidak perlu memastikan bahwa entri dalam direktori yang berisi file tersebut juga telah mencapai disk. Untuk itufsync()
yang eksplisit pada deskriptor file untuk direktori juga diperlukan.
Perhatikan bahwa jaminan yang disediakan Linux untuk fsync()
jauh lebih kuat daripada yang disediakan untuk sync()
atau syncfs()
, dan oleh POSIX untuk fsync()
dan sync()
.
Singkatnya:
- POSIX
fsync()
:"silakan tulis data untuk file ini ke disk" - POSIX
sync()
:"tulis semua data ke disk saat Anda menyiasatinya" - Linux
sync()
:"tulis semua data ke disk (ketika Anda melakukannya?)" - Linux
syncfs()
:"tulis semua data untuk sistem file yang terkait dengan file ini ke disk (ketika Anda menyiasatinya?)" - Linux
fsync()
:"tulis semua data dan metadata untuk file ini ke disk, dan jangan kembali sampai Anda melakukannya"
Perhatikan bahwa halaman manual Linux tidak menentukan kapan sync()
dan syncfs()
kembali.
Saya pikir jawaban saat ini tidak lengkap. Untuk Linux:
Menurut spesifikasi standar (misalnya, POSIX.1-2001),
sync()
menjadwalkan penulisan, tetapi dapat kembali sebelum penulisan sebenarnya selesai. Namun Linux menunggu penyelesaian I/O, dan dengan demikiansync()
atausyncfs()
memberikan jaminan yang sama sepertifsync
dipanggil pada setiap filedalam sistem atau sistem file masing-masing.
dan
Sebelum versi 1.3.20 Linux tidak menunggu I/O selesai sebelum kembali.
Ini disebutkan di sync(2)
di bagian "catatan" dan "bug".