2010-01-11 10 views
8

मेरे पास एक प्रोग्राम है जो दो फ़ाइल नामों को तर्क के रूप में स्वीकार करता है: यह दूसरी फ़ाइल बनाने के लिए पहली फ़ाइल को पढ़ता है। मैं कैसे सुनिश्चित कर सकता हूं कि कार्यक्रम पहली फ़ाइल को ओवरराइट नहीं करेगा?यह जांचने के लिए कि दो फ़ाइल नाम एक ही भौतिक फ़ाइल को इंगित करते हैं

प्रतिबंध:

  • विधि काम कर जब फाइल सिस्टम का समर्थन करता है (मुलायम या हार्ड) लिंक
  • फाइल अनुमति तय कर रहे हैं और यह केवल आवश्यक है कि पहली फ़ाइल पठनीय और दूसरी फ़ाइल है रखना चाहिए लिखने योग्य
  • यह बेहतर मंच के तटस्थ होना चाहिए
+8

यूनिक्स और लिनक्स दर्शन में, इस तरह के एक कार्यक्रम को फ़िल्टर कहा जाता है। यह आमतौर पर मानक इनपुट (एसटीडीआईएन) से पढ़ता है और मानक आउटपुट (एसटीडीओयूटी) को लिखता है। यह ऐसे कार्यक्रमों को लिखना आसान बनाता है क्योंकि यह कॉलर को ऐसी सत्यापन की ज़िम्मेदारी को रोकता है। आपका कार्यक्रम अपनी नौकरी करने पर ध्यान केंद्रित कर सकता है। –

उत्तर

12

लिनक्स पर, दोनों फाइलें खोलें, और का उपयोग करें ताकि यह जांच सके कि st_ino (संपादित करें :) और st_dev समान हैं। open प्रतीकात्मक लिंक का पालन करेंगे। दौड़ की स्थिति को रोकने के लिए सीधे stat का उपयोग न करें।

+4

दौड़ की स्थिति का मतलब है कि फ़ाइल स्थिति स्टेट (2) और खुली (2) के बीच बदल सकती है। आप स्टेट करते हैं, और फिर कुछ उपयोगकर्ता आपके द्वारा अभी बताए गए फ़ाइल को अनलिंक करते हैं और आपकी दूसरी फ़ाइल को उस व्यक्ति को लिंक करते हैं जिसे आप खोलने वाले हैं (2)। बस एक स्पष्टीकरण। –

+7

यह भी सुनिश्चित करें कि 'st_dev' फ़ील्ड मेल खाते हैं। एक ही इनोड संख्या होने से दो अलग-अलग खंडों पर अलग-अलग फ़ाइलों को रोकने के लिए कुछ भी नहीं है। –

3

संभव हो तो, पहले फ़ाइल को खोलने (हालांकि लिनक्स प्राथमिक लक्ष्य है) केवल पढ़ने के लिए, (O_RDONLY) LINUX में। फिर, यदि आप इसे लिखने के लिए इसे फिर से खोलने का प्रयास करते हैं, तो आपको एक त्रुटि मिल जाएगी।

+0

यदि दूसरी फ़ाइल पहले से ही दूसरी प्रक्रिया द्वारा केवल पढ़ने के लिए खुली है तो आपको झूठी सकारात्मक मिलेगी। मुझे यह भी यकीन नहीं है कि सार्वभौमिक समाधान संभव है (आपको फ़ाइल आईडी प्राप्त करने जैसी फ़ाइल-सिस्टम-विशिष्ट विशेषताओं का सहारा लेना होगा)। – Costique

9

सर्वोत्तम शर्त फ़ाइल नामों को पहचान के रूप में उपयोग नहीं करना है। इसके बजाए, जब आप फ़ाइल को पढ़ने के लिए खोलते हैं, तो इसे लॉक करें, जो भी आपके ओएस का समर्थन करता है। जब आप लिखने के लिए फ़ाइल भी खोलते हैं, तो इसे लॉक भी करें - यदि लॉक विफल हो जाता है, तो त्रुटि की रिपोर्ट करें।

+0

बहुत ही अनूठा नहीं है, लेकिन अच्छा मेटा तर्क जो अधिकांश प्लेटफॉर्म पर काम करेगा, – dmckee

0

आप फ़ाइल स्थिति प्राप्त करने के लिए stat का उपयोग कर सकते हैं और जांच सकते हैं कि इनोड संख्याएं समान हैं या नहीं।

-1

शायद आप कुछ खोल आदेशों को आमंत्रित करने के लिए सिस्टम() फ़ंक्शन का उपयोग कर सकते हैं?

बैश, आप बस कहेंगे:

stat -c %i filename 

यह एक फ़ाइल के आइनोड संख्या प्रदर्शित करता है। आप इस तरह दो फाइलों की तुलना कर सकते हैं और यदि उनके इनोड समान हैं, तो इसका मतलब है कि वे कड़े लिंक हैं। निम्नलिखित कॉल:

stat -c %N filename 

फ़ाइल का नाम प्रदर्शित करेगा और अगर यह एक प्रतीकात्मक कड़ी है, यह फ़ाइल नाम यह रूप में अच्छी तरह से जोड़ता है मुद्रित होगा। यह केवल एक ही नाम प्रिंट करता है, भले ही फ़ाइल को इंगित करने के लिए हार्ड लिंक हों, इसलिए प्रतीकात्मक लिंक की जांच करने के लिए दूसरी फ़ाइल के लिए इनोड संख्याओं की तुलना करने की आवश्यकता होगी और यह सुनिश्चित करने के लिए प्रतीकात्मक लिंक लिंक फ़ाइल की आवश्यकता होगी।

आप स्टेट आउटपुट को टेक्स्ट फ़ाइल में रीडायरेक्ट कर सकते हैं और फिर अपने प्रोग्राम में फ़ाइल को पार्स कर सकते हैं।

+1

मेरा डाउनवोट नहीं है, लेकिन डेटा को टेक्स्ट में कनवर्ट करने और फिर पाठ को पार्स करने के लिए कमांड चलाने के लिए शायद ही कभी एक बिंदु है। यूनिक्स सिस्टम पर यह भी देखें कि मैन पेज का सेक्शन अनुभाग आपको आम तौर पर बताएगा कि कमांड लाइन यूटिलिटीज उनके काम को प्राप्त करने के लिए क्या कह रही है। इस मामले में 'मैन 1 स्टेट' मुझे 'lstat (2)' और 'stat (2) 'के बारे में बताता है जो' fstat (2) 'के साथ एक मैन पेज साझा करता है, ताकि आप इष्टतम उत्तर को आसानी से प्राप्त कर सकें। – dmckee

+0

आम तौर पर, मैं चीज कॉलिंग सिस्टम() एक बुरी चीज (टीएम) है। बस एक संभावना का सुझाव दिया, हालांकि मैं इसे उपमहाद्वीप पहचानता हूं। – mingos

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