क्या एक निर्देशिका को हटा दिया जाता है जब इसकी कड़ी कड़ी की संख्या 0 हो जाती है?


10

क्या एक निर्देशिका को हटा दिया जाता है जब इसकी कड़ी कड़ी की संख्या 0 हो जाती है?

एक निर्देशिका में हमेशा कम से कम 2 हार्ड लिंक की संख्या होती है, क्योंकि .। जब rm -rएक निर्देशिका, यह 1 के बजाय 2 से 0 से हार्ड लिंक की संख्या को कम करती है?

क्या किसी निर्देशिका की कड़ी की संख्या कभी 1 हो सकती है?

धन्यवाद।

जवाबों:


9

सबसे पहले सभी फाइल सिस्टम उपयोग नहीं करते हैं .और ..हार्ड लिंक के रूप में। यह मैनुअल खोजा गया है। मैं अपने शेष उत्तर के लिए उन फाइल सिस्टम को अनदेखा करने जा रहा हूं क्योंकि वे यूनिक्स के लिए डिज़ाइन नहीं किए गए थे और केवल स्पष्टता को जोड़े बिना चीजों को जटिल करते हैं। मैं रूट डायरेक्टरी और माउंट पॉइंट्स को एक ही कारण से अनदेखा करने जा रहा हूं।

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


धन्यवाद। एक निर्देशिका में एक कड़ी होती है .., केवल जब यह एक उपनिर्देशिका होती है, तो सही? तो ..हमेशा एक निर्देशिका के लिए मौजूद नहीं है, है ना?
टिम

..प्रत्येक निर्देशिका कि में मौजूद है है एक उपनिर्देशिका। जो सभी है, लेकिन /एक भी है, तो सभी निर्देशिकाओं।
hildred

1
(१) यदि किसी निर्देशिका में कोई उपखंड नहीं है, तो निर्देशिका ..का स्वयं से कोई कठिन संबंध नहीं है। डीआईआर के लिए कठिन लिंक क्या हैं? pathname के साथ फ़ाइल, और .? (२) आप माउंट पॉइंट्स की अनदेखी क्यों करते हैं?
टिम

यदि निर्देशिका एक उप-निर्देशिका है। प्रविष्टि ..माता-पिता को इंगित करेगी। एक विशेष मामले के रूप में रूट निर्देशिका लिंक खुद को इंगित करता है। यह अनुमति देता है cd ..\..और इसी तरह की आज्ञाओं के रूप में काम करने के लिए कोई फर्क नहीं पड़ता कि आप कहाँ हैं। आप statकमांड के साथ परीक्षण कर सकते हैं ।
बिलथोर

1
आप सही हैं कि लिंक की संख्या 2 से कम नहीं है, लेकिन इसकी वजह से नहीं है ..। इसका कारण .और मूल निर्देशिका में नाम है जो इसे इंगित करता है। एकमात्र अपवाद जड़ है, जिसका कोई माता-पिता नहीं है। लेकिन यह ..खुद को इंगित करता है, इसलिए इसकी लिंक संख्या = 2. भी है
बरमार

11

पारंपरिक रूप से डिज़ाइन की गई UNIX फाइल सिस्टम पर कोई भी फाइल जिसकी संदर्भ संख्या (जैसे हार्डलिंक गणना का योग और ओपन फाइल हैंडल की संख्या *) 0 तक पहुंच जाती है, हटा दी जाती है। हालांकि, आधुनिक यूनिक्स प्रणालियों पर, rmdirसिस्टम कॉल हटाने .और ..एक-एक करने के बजाय एक एकल ऑपरेशन में एक खाली निर्देशिका को हटा देता है ।

ऐतिहासिक यूनिक्स प्रणालियों में, हालांकि, यह सिस्टम कॉल मौजूद नहीं था। इसके बजाय, rmdir आदेश एक setuid कार्यक्रम था ( स्रोत कोड यहां पाया जा सकता है), जो जाँच की है कि एक निर्देशिका खाली (विशेष प्रविष्टियों को छोड़कर) था, और फिर हटा दिया ..और .उस क्रम में, है, और फिर निर्देशिका ही है, साथ निकाले गए सभी unlinkसिस्टम कॉल जो केवल रूट को निर्देशिकाओं पर उपयोग करने की अनुमति थी (इसलिए कमांड को सेट क्यों किया गया था)। इसलिए, उन सिस्टमों पर, निर्देशिका की लिंक संख्या को क्षण भर बाद 1 .हटा दिया जाएगा, लेकिन पहले निर्देशिका को निर्देशिका निर्देशिका से हटा दिया गया था, तब यह 0 होगी।

rmआदेश, संयोग से, निर्देशिका हटाने से भी जड़ को रोका। और अपनी सामग्री को खाली करने के बाद निर्देशिकाओं को हटाने के rm -rलिए rmdirकमांड को कॉल करेगा ।

इन ऐतिहासिक सिस्टम पर, का दुरुपयोग unlinkएक कार्यक्रम से कॉल, रूट के रूप में चल रहा है के साथ एक रेस स्थिति में चल रहा है rmdirया mv, या एक प्रक्रिया है जिसका वर्तमान निर्देशिका (आधुनिक प्रणालियों इसे रोकने) हटा दिया गया है में एक फ़ाइल बनाने, फाइल या निर्देशिका झूलते में परिणाम सकता है जिसकी हार्डलाइन संख्या 0 से ऊपर है, लेकिन निर्देशिका ट्री में मौजूद नहीं है। इस स्थिति का पता लगाया गया था dcheck, और अभी भी जाँच में fsckसे एक है क्योंकि यह अधिकांश फाइल सिस्टम पर शारीरिक रूप से संभव है।


फ़ाइल सिस्टम, संयोग से, (सहित निर्देशिका को लागू करने की आवश्यकता नहीं है .और ..है कि hardlinks सामान्य फ़ाइलें)। इन filesystems पर, एक निर्देशिका की हार्डलिंक गणना हमेशा रिपोर्ट की जाएगी 0(लेकिन निश्चित रूप से, मूल निर्देशिका के भीतर इसका अस्तित्व 1 के "संदर्भ गणना" के लिए योग्य है)।


हटाए गए निर्देशिका का व्यवहार (जैसे जब एक प्रक्रिया द्वारा जांच की जाती है जो पहले से ही खुला है या इसकी वर्तमान निर्देशिका के रूप में है) और एक निर्देशिका की "लिंक गणना" का सटीक अर्थ अनिर्दिष्ट है। उदाहरण के लिए, मैक ओएस एक्स पर, यह 2 की हार्डलिंक गणना की रिपोर्ट करेगा , भले ही इसमें कोई वास्तविक हार्डलिंक न हो। हालांकि .और ..सूची में दिखाई नहीं देते, निर्देशिका खोला जा सकता है और statनाम के साथ कहा जा सकता है .या ..। लिनक्स पर, लिंक गणना 0 है, लेकिन .और ..काम वैसे ही अभी भी।

मैक ओएस एक्स भी एक निर्देशिका में सभी फाइलों की संख्या को लिंक संख्या के रूप में रिपोर्ट करता है , बजाय उपनिर्देशिकाओं की संख्या के। लेकिन यह 2 भी है .और जब ..चले गए हैं।


* इसमें सामान्य ओपन डिस्क्रिप्टर, मेमोरी-मैप्ड सेक्शन (उदाहरण के लिए बायनेरी और शेयर्ड लाइब्रेरीज़ को शामिल करना) और वर्तमान निर्देशिकाओं को प्रोसेस करना शामिल है।


2
strcpyएक नियत आकार में एक निश्चित निष्पादन योग्य सरणी में ... ये अच्छे समय थे!
एंड्रिया कोरबेलिनी

@AndreaCorbellini वास्तव में mkdirइस तथ्य के आधार पर एक प्रकाशित कारनाम है कि इसे रिवर्स में एक ही काम करना है।
रैंडम 832

1
मुझे लगता है कि मैंने इसे पाया: securityfocus.com/archive/1/365038/2004-05-31/2004-06-06/0 :)
एंड्रिया कोरबेलिनी

के बारे में पूछते हुए rmdir, क्या ..माता-पिता निर्देशिका को नहीं हटाएंगे ?
एडवर्ड टोरवाल्ड्स

@edwardtorvalds नहीं, मैं ".." लिंक को हटाने की बात कर रहा था, अभिभावक निर्देशिका नहीं जो यह इंगित करता है।
रैंडम 832 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.