Apa yang terjadi ketika Anda membaca file saat ditimpa?

Jawaban:

19

Itu tergantung pada apa yang penulis lakukan.

Jika penulis menimpa file yang ada, maka pembaca akan melihat konten baru ketika penulis menyalip pembaca, jika pernah. Jika penulis dan pembaca melanjutkan dengan kecepatan variabel, pembaca dapat melihat alternatif konten lama dan baru.

Jika penulis memotong file sebelum mulai menulis, pembaca akan berjalan melawan ujung file pada saat itu.

Jika penulis membuat file baru kemudian memindahkan file baru ke nama lama, pembaca akan terus membaca dari file lama. Jika file yang dibuka dipindahkan atau dihapus, proses yang membuka file tersebut tetap membaca dari file yang sama. Jika file dihapus, sebenarnya tetap ada di disk (tetapi tidak bisa membukanya lagi) sampai proses terakhir telah menutupnya.

Sistem Unix cenderung tidak memiliki kunci wajib . Jika suatu aplikasi ingin memastikan bahwa komponen penulisnya dan komponen pembacanya tidak saling menginjak kaki, terserah pengembang untuk menggunakan penguncian yang tepat. Ada beberapa pengecualian di mana file yang dibuka oleh kernel dapat dilindungi dari penulisan oleh aplikasi pengguna, misalnya gambar sistem file loop- mount atau executable yang dieksekusi pada beberapa varian unix.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Gilles, apakah penjelasan Anda juga berlaku di ftp/ sftpskenario? Katakanlah suatu proses mulai membaca ftpfile yang ditransmisikan sementara versi lain dari file yang sama menimpanya karena transmisi baru.
iruvar
@ 1_CR Ya. Dalam hal ini, penulis dan pembaca adalah proses ftpd.
Gilles 'SANGAT berhenti menjadi jahat'
apa arti menyalip di sini?
Victor Choy
@VictorChoy Arti standar: untuk memulai di belakang / setelah orang lain dan pada titik tertentu bergerak di depan mereka.
Gilles 'SO- stop being evil'
18

Ini adalah kondisi balapan klasik, sehingga hasilnya tidak dapat diprediksi secara definisi.

Antara lain, itu tergantung

  • fopen(3)atau open(2)mode tulis,
  • bagaimana / jika penulis buffering outputnya,
  • bagaimana pembaca membaca file,
  • perbedaan kecepatan antara pembaca dan penulis,
  • perbedaan waktu antara awal membaca dan penulis.
  • Dan tentu saja, pada mesin multi-core modern, segala sesuatunya menjadi lebih rumit oleh faktor-faktor lain yang lebih rendah (misal penjadwalan proses).

Jika Anda harus dapat membaca file saat sedang ditulis ulang, maka Anda dapat membuat penulis membuat salinan sementara dari file tersebut, memodifikasinya, lalu menyalinnya kembali ke file asli. Ini caranya rsync, misalnya. Ada beberapa cara untuk mengimplementasikan ini, tetapi tidak ada makan siang gratis. Setiap metode memiliki kekurangan dan akibatnya sendiri.

Alexios
sumber
1
Jawaban ini jauh lebih komprehensif daripada jawaban saya. Menghapus jawaban saya.
killermist
0

Responden sebelumnya memiliki penjelasan yang lebih komprehensif dari ini, tapi di sini ada trik yang pasti juga berfungsi, cukup banyak melakukan apa yang dia inginkan:

$ tail -f <filename>

Akan menunjukkan kepada Anda akhir file saat sedang ditulis. Berguna jika Anda ingin mengirim pipa STDERR ke file tetapi masih melihatnya di jendela terminal lain, misalnya.

Willoughby Will
sumber