Bayangkan dua proses, pembaca dan penulis, berkomunikasi melalui file biasa pada ext3 fs. Pembaca memiliki IN_MODIFY
arloji tidak sah pada file. Penulis menulis 1000 byte ke file, dalam satu write()
panggilan. Pembaca mendapat acara inotify, dan memanggil fstat
file tersebut. Apa yang dilihat Pembaca?
Apakah ada jaminan bahwa Reader akan mendapatkan kembali setidaknya 1000 untuk
st_size
di file? Dari eksperimen saya, sepertinya tidak.Apakah ada jaminan bahwa Reader dapat benar-benar
read()
1000 byte?
Ini terjadi pada kotak I / O terikat serius. Misalnya, sar
menunjukkan waktu tunggu sekitar 1 detik. Dalam kasus saya Pembaca sebenarnya menunggu 10 detik SETELAH mendapatkan acara inotify sebelum menelepon stat
, dan mendapatkan hasil yang terlalu kecil.
Apa yang saya harapkan adalah acara inotify tidak akan terkirim sampai file siap. Apa yang saya curigai sebenarnya terjadi adalah bahwa peristiwa inotify akan menyala SELAMA write()
panggilan dalam Writer, dan data tersebut sebenarnya tersedia untuk proses lain pada sistem kapan pun ia siap. Dalam hal ini, 10s tidak cukup waktu.
Saya kira saya hanya mencari konfirmasi bahwa kernel benar-benar mengimplementasikan cara saya menebak. Juga, jika ada opsi, mungkin, untuk mengubah perilaku ini?
Akhirnya- apa gunanya memberi tahu, mengingat perilaku ini? Lagipula Anda hanya akan memilih file / direktori, setelah Anda mendapatkan acara, sampai data benar-benar tersedia. Sebaiknya lakukan itu selama ini, dan lupakan tentang tidak mengizinkan.
*** EDIT ** * * Oke, seperti yang sering terjadi, perilaku yang saya lihat sebenarnya masuk akal, sekarang saya mengerti apa yang sebenarnya saya lakukan. ^ _ ^
Saya sebenarnya merespons acara IN_CREATE di direktori tempat file tersebut berada. Jadi saya sebenarnya stat () 'ing file dalam menanggapi pembuatan file, belum tentu acara IN_MODIFY, yang mungkin akan tiba nanti.
Saya akan mengubah kode saya sehingga, setelah saya mendapatkan acara IN_CREATE, saya akan berlangganan IN_MODIFY pada file itu sendiri, dan saya tidak akan benar-benar mencoba membaca file sampai saya mendapatkan acara IN_MODIFY. Saya menyadari bahwa ada jendela kecil di sana di mana saya mungkin ketinggalan menulis ke file, tetapi ini dapat diterima untuk aplikasi saya, karena dalam kasus terburuk, file akan ditutup setelah jumlah detik maksimum.