ลองนึกภาพสองกระบวนการผู้อ่านและนักเขียนสื่อสารผ่านไฟล์ปกติบน ext3 fs Reader มี inotify IN_MODIFY
watch ในไฟล์ Writer เขียน 1,000 ไบต์ไปยังไฟล์ในการwrite()
โทรครั้งเดียว Reader รับเหตุการณ์ inotify และเรียกfstat
ใช้ไฟล์ Reader เห็นอะไร
มีการรับประกันว่า Reader จะได้รับคืนอย่างน้อย 1,000
st_size
ไฟล์หรือไม่? จากการทดลองของฉันดูเหมือนจะไม่มีการรับประกันว่า Reader สามารถ
read()
1,000 ไบต์จริงหรือไม่?
สิ่งนี้เกิดขึ้นใน I / O bound box ที่จริงจัง ตัวอย่างเช่นsar
แสดงเวลาที่รอประมาณ 1 วินาที ในกรณีของฉัน Reader กำลังรอ 10 วินาทีหลังจากได้รับการแจ้งเตือนเหตุการณ์ก่อนที่จะโทรstat
และรับผลลัพธ์ที่น้อยเกินไป
สิ่งที่ฉันหวังไว้คือเหตุการณ์ inotify จะไม่ถูกส่งจนกว่าไฟล์จะพร้อม สิ่งที่ฉันสงสัยว่าจริง ๆ แล้วเกิดขึ้นคือเหตุการณ์ inotify เกิดเพลิงไหม้ในระหว่างการwrite()
โทรใน Writer และข้อมูลนั้นพร้อมใช้งานสำหรับกระบวนการอื่น ๆ ในระบบเมื่อใดก็ตามที่เกิดความพร้อม ในกรณีนี้ 10 วินาทีมีเวลาไม่เพียงพอ
ฉันเดาว่าฉันแค่กำลังมองหาการยืนยันว่าเคอร์เนลใช้งานจริงแจ้งวิธีที่ฉันคาดเดา นอกจากนี้หากมีตัวเลือกใด ๆ อาจเป็นไปได้ที่จะแก้ไขพฤติกรรมนี้
ในที่สุด - อะไรคือประเด็นของการระบุไม่ถูกต้องเนื่องจากพฤติกรรมนี้ คุณจะถูกลดขนาดให้ทำการสำรวจไฟล์ / ไดเรกทอรีหลังจากคุณได้รับเหตุการณ์จนกระทั่งข้อมูลมีอยู่จริง อาจจะทำเช่นนั้นมาตลอดและลืมเกี่ยวกับการไม่พูดถึง
*** แก้ไข ** * * โอเคบ่อยครั้งที่เกิดขึ้นพฤติกรรมที่ฉันเห็นมีเหตุผลจริง ๆ ตอนนี้ฉันเข้าใจแล้วว่าฉันกำลังทำอะไรอยู่ ^ _ ^
ฉันกำลังตอบกลับเหตุการณ์ IN_CREATE ในไดเรกทอรีที่ไฟล์นั้นอาศัยอยู่ดังนั้นฉันจึงกำลัง stat () ในการตอบสนองต่อการสร้างไฟล์ไม่จำเป็นต้องเป็นเหตุการณ์ IN_MODIFY ซึ่งอาจมาถึงในภายหลัง
ฉันจะเปลี่ยนรหัสของฉันดังนั้นเมื่อฉันได้รับเหตุการณ์ IN_CREATE ฉันจะสมัครสมาชิก IN_MODIFY ในไฟล์เองและฉันจะไม่พยายามอ่านไฟล์จนกว่าจะได้รับ IN_MODIFY ฉันรู้ว่ามีหน้าต่างเล็ก ๆ ที่ฉันอาจพลาดเขียนไฟล์ แต่นี่เป็นที่ยอมรับสำหรับแอปพลิเคชันของฉันเพราะในกรณีที่เลวร้ายที่สุดไฟล์จะถูกปิดหลังจากจำนวนวินาทีสูงสุด