2011-04-22 15 views
10

मैं कैसे जांच सकता हूं कि फ़ाइल अभी भी लिखी जा रही है या नहीं? मुझे किसी अन्य प्रक्रिया द्वारा फ़ाइल को बनाने, लिखने और बंद करने की प्रतीक्षा करने की आवश्यकता है, इसलिए मैं अपनी प्रक्रिया में इसे फिर से खोल सकता हूं।कैसे जांचें कि कोई फ़ाइल अभी भी लिखी जा रही है या नहीं?

+1

क्या आप अपने उपयोगकेस को और अधिक अच्छी तरह समझा सकते हैं? शायद आपके लिए एक फ़ाइल के बजाय पाइप (सरल पाइप या नामित पाइप) का उपयोग करना आपके लिए आसान है। – evnu

+0

यदि यह मदद करता है, हालांकि ... लिखना/लिखना परमाणु हैं। इसलिए, जब तक आप गारंटी देना चाहते हैं कि आपके लेखन अन्य लेखनों के साथ मिलकर नहीं मिलते हैं, आपको बस इतना करना है कि आप जो कुछ भी लिखते हैं वह लिखने के लिए एक कॉल में फिट बैठता है()।फिर यह वास्तव में कोई फर्क नहीं पड़ता कि फ़ाइल खुली है या नहीं, ओएस इसे किसी भी तरह से हल करेगा। – Damon

+0

संभावित डुप्लिकेट [यह सुनिश्चित करने के लिए कि इसे लिखने से पहले फ़ाइल को न पढ़ना सुनिश्चित करें] (http://stackoverflow.com/questions/3267685/how-to-make-sure-not-to-read-a- फाइल-से-फिनिशिंग-द-राइट-टू-इट) – Beginner

उत्तर

5

सामान्य रूप से, यह हल करने में एक कठिन समस्या है। आप पूछ सकते हैं कि कुछ परिस्थितियों में फ़ाइल खुली है; हालांकि, अगर दूसरी प्रक्रिया एक स्क्रिप्ट है, तो यह फ़ाइल को कई बार खोल और बंद कर सकती है। मैं दृढ़ता से अनुशंसा करता हूं कि आप किसी सलाहकार लॉक का उपयोग करें, या फ़ाइल के साथ किए जाने पर संवाद करने के लिए दूसरी प्रक्रिया के लिए कुछ अन्य स्पष्ट विधि का उपयोग करें।

उसने कहा, अगर यह कोई विकल्प नहीं है, तो दूसरा तरीका है। यदि आप /proc/<pid>/fd निर्देशिकाओं में देखते हैं, जहां <pid> कुछ चल रही प्रक्रिया की संख्यात्मक प्रक्रिया आईडी है, तो आप प्रक्रियाओं को खोलने वाली फ़ाइलों के लिए सिम्लिंक का एक गुच्छा देखेंगे। सिम्लिंक पर अनुमतियाँ उस मोड को प्रतिबिंबित करती हैं जिसकी फ़ाइल को खोला गया था - लिखने की अनुमति का अर्थ है कि इसे लिखने के तरीके के लिए खोला गया था।

तो, यदि आप जानना चाहते हैं कि कोई फ़ाइल खुलती है, तो बस अपनी प्रक्रिया में प्रत्येक प्रक्रिया के /proc एंट्री और प्रत्येक फ़ाइल डिस्क्रिप्टर को स्कैन करें, अपनी फ़ाइल में लिखने योग्य सिम्लिंक की तलाश करें। यदि आप अन्य प्रक्रिया के पीआईडी ​​को जानते हैं, तो आप सीधे अपनी proc प्रविष्टि को भी देख सकते हैं।

इसमें कुछ प्रमुख डाउनसाइड्स हैं। सबसे पहले, आप केवल अपनी प्रक्रियाओं के लिए खुली फाइलें देख सकते हैं, जब तक आप रूट न हों। यह अपेक्षाकृत धीमी है, और केवल लिनक्स पर ही काम करता है। और फिर, यदि दूसरी प्रक्रिया फ़ाइल को कई बार खुलती है और बंद कर देती है, तो आप अटक जाते हैं - आप बंद अवधि के दौरान इसे देख सकते हैं, और यह जानने का कोई आसान तरीका नहीं है कि यह फिर से खुल जाएगा या नहीं।

+3

और यदि कुछ रिमोट प्रोसेस एनएफएस के माध्यम से फाइल लिख रहा है, तो आप इसे नहीं देख पाएंगे। (जब तक कोई स्थानीय प्रक्रिया नहीं होती है जो वास्तविक लेखन करता है, लेकिन मुझे लगता है कि यह कर्नेल में किया गया है।) –

3

आप लिखने की प्रक्रिया को एक सेंटीनेल फ़ाइल लिख सकते हैं ("sentinel.ok" कहें), यह पढ़ने के बाद आपकी रीडिंग प्रक्रिया में रुचि रखने वाली डेटा फ़ाइल लिखना समाप्त हो गया है। पढ़ने की प्रक्रिया में आप सेंटीनेल के अस्तित्व की जांच कर सकते हैं डेटा फ़ाइल पढ़ने से पहले, यह सुनिश्चित करने के लिए कि डेटा फ़ाइल पूरी तरह लिखी गई है।

1

@ blu3bird का एक सेंटीनेल फ़ाइल का उपयोग करने का विचार बुरा नहीं है, लेकिन इसे फ़ाइल लिखने वाले प्रोग्राम को संशोधित करने की आवश्यकता है।

यहाँ एक और संभावना भी लेखक को संशोधित करने की आवश्यकता है कि है, लेकिन यह और अधिक मजबूत हो सकता है:

एक अस्थायी फ़ाइल के लिए लिखें, कहते हैं कि "foo.dat.part"। जब लेखन पूर्ण हो जाता है, "foo.dat.part" से "foo.dat" का नाम बदलें। इस तरह एक पाठक या तो "foo.dat" को बिल्कुल नहीं देख पाएगा, या इसका पूरा संस्करण देखेंगे।

0

आप आप जानते हैं कि फ़ाइल, एक बार खोला जाएगा लिखा और उसके बाद बंद कर दिया है inotify

http://en.wikipedia.org/wiki/Inotify

का उपयोग कर की कोशिश कर सकते, यह संभव अपने अनुप्रयोग IN_CLOSE_WRITE घटना के लिए प्रतीक्षा करने के लिए किया जाएगा।

हालांकि अगर फ़ाइल के लेखन को करने वाले दूसरे एप्लिकेशन का व्यवहार खुले, लिखने, बंद, खुले, लिखने, बंद करने जैसा अधिक है .... तो आपको यह निर्धारित करने के कुछ अन्य तंत्र की आवश्यकता होगी जब अन्य ऐप वास्तव में फाइल के साथ समाप्त हो गया है।

संबंधित मुद्दे