2012-07-09 6 views
9

मैं एक लिनक्स कर्नेल मॉड्यूल बनाने की कोशिश कर रहा हूं, जो खुले, बंद, पढ़ने और लिखने के कार्यों का समर्थन करता है। इसलिए मैं इन कार्यों को संरचना file_operations के माध्यम से पंजीकृत करना चाहता हूं, हालांकि मुझे संरचना में 'बंद' प्रविष्टि नहीं मिल रही है। मुझे लगता है कि मुझे 'करीबी' के बजाय 'रिलीज' का उपयोग करना चाहिए, लेकिन मुझे आश्चर्य है कि नाम 'रिलीज' क्यों है और 'बंद' नहीं है?लिनक्स कर्नेल में 'struct file_operations` में क्लोज फ़ंक्शन को रिलीज़ क्यों कहा जाता है?

+0

तो आप पूछ रहे हैं कि इसे 'रिलीज' कहा जाता है और 'बंद' क्यों नहीं किया जाता है? – cnicutar

+0

हां, मैंने शीर्षक तय किया। –

उत्तर

11

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

रिलीज: इस फाइल के अंतिम पास (2) में कहा जाता है, यानी जब फ़ाइल> f_count 0. हालांकि पूर्णांक लौटने के रूप में परिभाषित, वापसी मूल्य VFS द्वारा नजरअंदाज कर दिया है तक पहुँच जाता है (देखें एफएस/file_table। ग: __ fput())। more

+2

चलिए यह भी ध्यान दें कि mmap फ़ाइल को संदर्भित करता है; ओपन, एमएमएपी, क्लोज़ अनुक्रम का परिणाम तुरंत रिलीज होने के साथ नहीं होता है, लेकिन जब मुनमैप कहा जाता है। – auselen

4

मुझे एक समान भ्रम था। उस रिलीज में वास्तविक सही है जिसे क्लोज़ कहा जाता है। यहाँ पुस्तक Linux Device Drivers 3rd edition से एक उद्धरण है:

int (*flush) (struct file *); 

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

int (*release) (struct inode *, struct file *); 

फ़ाइल ऑपरेशन जारी होने पर यह ऑपरेशन लागू किया जाता है। खुले की तरह, रिलीज गायब हो सकता है।

ध्यान दें कि प्रत्येक बार प्रक्रिया बंद होने पर रिलीज नहीं किया जाता है। जब भी कोई फ़ाइल संरचना साझा की जाती है (उदाहरण के लिए, कांटा या डुप्लिकेट के बाद), रिलीज तब तक नहीं की जाएगी जब तक कि सभी प्रतियां बंद न हों। यदि आपको कोई भी प्रति बंद होने पर लंबित डेटा फ़्लश करने की आवश्यकता है, तो आपको फ्लश विधि लागू करनी चाहिए।

+1

यदि एक एकल प्रक्रिया में दो फ़ाइल डिस्क्रिप्टर एक ही फ़ाइल का जिक्र करते हैं, तो प्रत्येक फ़ाइल डिस्क्रिप्टर पर 'क्लोज़()' को कॉल करने से 'रिलीज' दो बार आ जाएगा। – Asblarf

+1

@Asblarf यह समझ में आता है कि एक अलग "संरचना फ़ाइल *" ऑब्जेक्ट को कर्नेल के अंदर एक प्रक्रिया द्वारा खोले गए प्रत्येक फ़ाइल डिस्क्रिप्टर के लिए बनाए रखा जाएगा। –

+0

बिल्कुल, मैं 'संरचना फ़ाइल *' का प्रतिनिधित्व करने पर अधिक बारीकी से देखकर यही पाया। – Asblarf

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