Ext3 fs dosyasındaki normal bir dosya üzerinden iletişim kuran iki işlem, bir okuyucu ve bir yazar düşünün. Reader'ın IN_MODIFY
dosyada bir inotify saati var. Yazar, dosyaya tek bir write()
çağrıda 1000 bayt yazar . Reader inotify olayını alır fstat
ve dosyayı çağırır . Reader ne görür?
Reader'ın
st_size
dosya için en az 1000 geri alacağının garantisi var mı ? Deneylerimden öyle değil.Reader'ın aslında
read()
1000 bayt olabileceğine dair bir garanti var mı ?
Bu ciddi bir G / Ç bağlantılı kutuda oluyor. Örneğin, sar
yaklaşık 1 saniyelik bir bekleme süresini gösterir. Benim durumumda Reader, aramadan önce inotify olayını aldıktan SONRA 10 saniye bekler stat
ve çok küçük sonuçlar alır.
Ne umuyordum inotify olay dosya hazır olana kadar teslim olmazdı. Şüphelendiğim şey, inotify olayının Yazardaki write()
çağrı SIRASINDA tetiklenmesidir ve veriler hazır olduğunda sistemdeki diğer süreçler için kullanılabilir. Bu durumda, 10s yeterli zaman değildir.
Sanırım sadece çekirdeğin aslında tahmin ettiğim şekilde inotifiye ettiğini doğrulamak istiyorum. Ayrıca, muhtemelen bu davranışı değiştirmek için herhangi bir seçenek varsa?
Son olarak, bu davranış göz önüne alındığında, inotifikasyonun anlamı nedir? Olay alındıktan sonra, veriler gerçekten kullanılabilir olana kadar, dosya / dizini yoklamaya başlamış olursunuz. Bunları baştan sona yapıyor olabilir ve inotifiye etmeyi unutun.
*** DÜZENLE ** * * Tamam, sık sık olduğu gibi, gördüğüm davranış gerçekten anlamlıdır, şimdi gerçekten ne yaptığımı anlıyorum. ^ _ ^
Aslında dosyanın yaşadığı dizindeki bir IN_CREATE olayına yanıt veriyorum. Bu yüzden aslında stat () 'ın dosyanın oluşturulmasına yanıt olarak, daha sonra gelen IN_MODIFY olay, ille ki mutlaka değilim.
Kodumu değiştireceğim, böylece IN_CREATE olayı aldığımda, dosyanın kendisinde IN_MODIFY abone olacağım ve IN_MODIFY olayını alana kadar dosyayı okumaya çalışmayacağım. Orada dosyaya bir yazma özledim olabilir küçük bir pencere olduğunu fark, ama bu benim uygulama için kabul edilebilir, çünkü en kötü durumda, dosya maksimum birkaç saniye sonra kapatılacaktır.