Misalkan saya membaca (cat) file sementara proses lain menulis ulang isinya. Apakah hasilnya dapat diprediksi? Apa yang akan terjadi?
Misalkan saya membaca (cat) file sementara proses lain menulis ulang isinya. Apakah hasilnya dapat diprediksi? Apa yang akan terjadi?
Jawaban:
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.
ftp/ sftpskenario? Katakanlah suatu proses mulai membaca ftpfile yang ditransmisikan sementara versi lain dari file yang sama menimpanya karena transmisi baru.
Ini adalah kondisi balapan klasik, sehingga hasilnya tidak dapat diprediksi secara definisi.
Antara lain, itu tergantung
fopen(3)atau open(2)mode tulis,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.
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.