दो प्रक्रियाओं, एक पाठक और एक लेखक की कल्पना करें, एक ext3 fs पर एक नियमित फ़ाइल के माध्यम से संचार कर रहा है। रीडर के पास IN_MODIFY
फ़ाइल पर एक इनोटिफ़ाइ वॉच है। राइटर सिंगल write()
कॉल में फाइल को 1000 बाइट्स लिखता है । रीडर को इनॉटिफाई इवेंट मिलता है, और fstat
फ़ाइल पर कॉल करता है। पाठक क्या देखता है?
क्या कोई गारंटी है कि रीडर को
st_size
फ़ाइल पर कम से कम 1000 मिलेंगे ? मेरे प्रयोगों से, ऐसा नहीं लगता।क्या कोई गारंटी है कि पाठक वास्तव में
read()
1000 बाइट्स कर सकता है ?
यह गंभीरता से I / O बाउंड बॉक्स पर हो रहा है। उदाहरण के लिए, sar
लगभग 1 सेकंड का प्रतीक्षा समय दिखाता है। मेरे मामले में पाठक वास्तव में 10 सेकंड के बाद प्रतीक्षा कर रहा है कि कॉल करने से पहले इनॉटिफाई इवेंट प्राप्त करें stat
, और बहुत छोटे परिणाम प्राप्त करें।
मुझे क्या उम्मीद थी कि जब तक फ़ाइल तैयार नहीं हो जाती, तब तक इवेंट को वितरित नहीं किया जाएगा। मुझे जो वास्तव में संदेह हो रहा है, वह यह है कि इनॉटिफाई इवेंट write()
लेखक में कॉल को दरकिनार करता है, और डेटा वास्तव में सिस्टम पर अन्य प्रक्रियाओं के लिए उपलब्ध होता है जब भी यह तैयार होता है। इस मामले में, 10s पर्याप्त समय नहीं है।
मुझे लगता है कि मैं सिर्फ इस बात की पुष्टि कर रहा हूं कि कर्नेल वास्तव में जिस तरह से अनुमान लगा रहा है उसे लागू करता है। इसके अलावा, अगर इस व्यवहार को बदलने के लिए कोई विकल्प हैं, तो संभवतः?
अंत में- इस व्यवहार को देखते हुए, क्या औचित्य की बात है? जब तक डेटा वास्तव में उपलब्ध न हो, तब तक आपको इवेंट मिलने के बाद फ़ाइल / निर्देशिका को पोलिंग करने के लिए कम कर दिया जाता है। के रूप में अच्छी तरह से हो सकता है कि सभी के साथ, और inotify भूल जाते हैं।
*** संपादित करें ** * * ठीक है, जैसा कि अक्सर होता है, जो व्यवहार मैं देख रहा हूं वह वास्तव में समझ में आता है, अब मैं समझता हूं कि मैं वास्तव में क्या कर रहा हूं। ^ _ ^
मैं वास्तव में उस फ़ाइल पर रहने वाली डायरेक्टरी पर एक IN_CREATE ईवेंट का जवाब दे रहा हूं। इसलिए मैं वास्तव में स्टेट () फाइल के निर्माण के जवाब में आईएनजी हूं, जरूरी नहीं कि IN_MODIFY ईवेंट हो, जो बाद में आ सकता है।
मैं अपना कोड बदलने जा रहा हूं, ताकि एक बार जब मुझे IN_CREATE ईवेंट मिल जाए, तो मैं फ़ाइल पर IN_MODIFY की सदस्यता लूंगा, और जब तक मुझे IN_MODIFY ईवेंट नहीं मिल जाता, तब तक मैं वास्तव में फ़ाइल को पढ़ने का प्रयास नहीं करूंगा। मुझे पता है कि वहाँ एक छोटी सी खिड़की है जिसमें मैं फ़ाइल को लिखने से चूक सकता हूं, लेकिन यह मेरे आवेदन के लिए स्वीकार्य है, क्योंकि सबसे खराब स्थिति में, फ़ाइल अधिकतम सेकंड के बाद बंद हो जाएगी।