जब निर्देशिका हटाई जाती है तो `ls` त्रुटि


13

मेरे पास दो खोल हैं। पहला निर्देशिका ए में है। दूसरे में, मैं निर्देशिका ए को हटाता हूं, और फिर इसे फिर से बनाता हूं। जब मैं पहले शेल पर वापस जाता हूं, और टाइप करता है ls, तो आउटपुट है:

ls: cannot open directory .: Stale file handle

क्यों? मैंने सोचा था कि पहला शेल (एक गैर-मौजूद निर्देशिका के अंदर खुला रहने वाला) अगले आदेश की प्रतीक्षा करते समय "फ्रीज" करेगा, और "एहसास" नहीं होगा कि निर्देशिका को हटा दिया गया था और फिर से बनाया गया था। क्या शेल स्ट्रिंग के अलावा अपनी वर्तमान कार्यशील निर्देशिका के लिए "गहरा" संदर्भ रखता है $PWD?


2
एक गैर-उत्तर, लेकिन यदि आप अपने शेल को वापस उसके पैरों पर गिराना चाहते हैं, तो आप दौड़ सकते हैं cd $PWD
dhag

मैं समझना चाहूंगा कि क्या चल रहा है, मुझे पता है कि शेल को वापस पाना आसान है :)
फॉनिनी

क्या यह निर्देशिका NFS सर्वर पर है? मुझे लगता है कि यही एक स्थिति है जहाँ आपको बासी फ़ाइल हैंडल मिलते हैं।
बरमार

निर्देशिका स्थानीय है। जब आप अपने सिस्टम में ऐसा करते हैं, तो परिणाम अलग होता है?
फॉनिनी

जवाबों:


17

एक निर्देशिका (किसी भी फ़ाइल की तरह) को उसके नाम से परिभाषित नहीं किया गया है। निर्देशिका के पते के रूप में नाम के बारे में सोचें । जब आप निर्देशिका को स्थानांतरित करते हैं, तो यह अभी भी वही निर्देशिका है, जैसे यदि आप अलग घर में जाते हैं, तो आप अभी भी वही व्यक्ति हैं। यदि आप किसी निर्देशिका को हटाते हैं और उसी नाम से एक नया बनाते हैं, तो यह एक नई निर्देशिका होती है, ठीक उसी तरह जैसे कि आप जिस घर में रहते थे, वह घर नहीं है।

प्रत्येक प्रक्रिया में एक कार्यशील निर्देशिका होती हैcdखोल में आदेश खोल के वर्तमान कार्यशील निर्देशिका बदलता है। pwdआदेश वर्तमान कार्यशील निर्देशिका को the¹ पथ प्रिंट करता है।

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

इसी तरह, देखें कि जब आप निर्देशिकाओं को चारों ओर घुमाते हैं तो क्या होता है।

mkdir one two
touch one/1 two/2
cd one
ls

दूसरे शेल में:

mv one tmp
mv two one
mv tmp two

पहले शेल में:

ls

फ़ाइल 1उस निर्देशिका में है जिसे मूल रूप से बुलाया गया था oneऔर अब कहा जाता है two। फ़ाइल 2उस निर्देशिका में है जिसे मूल रूप से बुलाया गया था twoऔर अब कहा जाता है one

Unique अधिक सटीक रूप से, एक पथ, जो अद्वितीय नहीं हो सकता है यदि प्रतीकात्मक लिंक या अन्य सूक्ष्मताएं शामिल हैं।


तो यहाँ मुख्य बात यह है कि एक प्रक्रिया अपने काम कर रहे निर्देशिका का इनकोड रखती है, न कि केवल पथ?
नाच -

1
@ नोट प्रक्रिया एक डिस्क्रिप्टर रखती है, लेकिन कर्नेल सभी मैपिंग (डिस्क्रिप्टर / फाइल टेबल एंट्री / इनोड) करता है। और वास्तव में, आंतरिक रूप से, कर्नेल पथों को संग्रहीत नहीं करता है (क्योंकि दिलचस्प सामान इनोड में है, पथ नहीं)। इसके अलावा, एक "पथ" एक फ़ाइल के लिए केवल एक लिंक है ... कई हो सकते हैं :)
जॉन डब्ल्यूएच स्मिथ

ओह ठीक है यह एक डिस्क्रिप्टर रखता है। तो bash लगातार वर्किंग डायरेक्टरी की एक fd रखता है? निश्चित रूप से सभी प्रक्रियाओं में कार्यशील डायरेक्टरी के fds नहीं हैं ... मुझे लगा कि मुझे स्टड / आउट / इरेट के बाद वैल्यू 3 से शुरू होने वाले fds याद हैं
Nacht -

2
@Nacht वर्तमान निर्देशिका फ़ाइल डिस्क्रिप्टर नहीं है, लेकिन यह एक तरह से बहुत काम करती है। कर्नेल प्रत्येक प्रक्रिया के लिए इसे बनाए रखता है। लिनक्स पर, आप इसे देख सकते हैं /proc/<pid>/cwd, जो काम करता है /proc/<pid>/fd/<number>। यह CWDके उत्पादन में lsof
गिल्स एसओ- बुराई को रोकना

cd - && cd -ऐसे मामले में स्वचालित बनाना संभव है ?
विटाली ज़डनेविच

8

नई निर्देशिका A, निर्देशिका A. के समान नहीं है। इसे statपुराने को हटाने से पहले और नया बनाने के बाद कमांड के साथ चेक किया जा सकता है और आपको अलग-अलग आई-नोड नंबर दिखाई देंगे।
और मुझे लगता है कि यह संबंधित है कि कर्नेल कैसे काम करता है। यह बस प्रत्येक प्रक्रिया के लिए वर्तमान निर्देशिका की संख्या का ट्रैक रखता है। इसलिए जैसा कि अलग-अलग आई-संख्या हैं इससे विभिन्न टकराव होंगे।


यह ध्यान दिया जाना चाहिए कि एक इनोड एक संरचना है, एक अद्वितीय संख्या नहीं है। इसे विशिष्ट रूप से पहचाना जा सकता है, लेकिन यह अपनी आईडी से अधिक जानकारी रखता है। यह वही है जो इसे लिंक से अधिक महत्वपूर्ण बनाता है।
जॉन डब्ल्यूएच स्मिथ

1
@ जॉनोहेमिथ मैं इस जवाब को हटाने जा रहा हूं क्योंकि गाइल्स एक बेहतर है।
तालीज़िन

6
आपका हटाने का कोई कारण नहीं है! यदि आप ऐसा महसूस करते हैं, तो आप अपने उत्तर में एक अस्वीकरण जोड़ सकते हैं और समझा सकते हैं कि आप दूसरे को बेहतर मानते हैं।
terdon

7

यह अपेक्षित व्यवहार है। नई निर्देशिका A पुरानी निर्देशिका A के समान नहीं है, यह केवल उसी नाम का होता है। तो पहले टर्मिनल का $ पीडब्ल्यूडी अभी भी चला गया है, यह जादुई रूप से प्रकट नहीं हुआ जब आपने किया था mkdir A


2
क्या आप 'नई निर्देशिका ए पर पुरानी निर्देशिका ए के समान नहीं है' पर विस्तार से बता सकते हैं। फ़ाइल / निर्देशिका के कौन से पहलू बदलते हैं? क्या यह इनोड नंबर के साथ करना है? पूछने के लिए क्षमा करें, लेकिन मैं सिर्फ इस बारे में सीख रहा हूं।
राहुल

2
@ तिराहे से, क्या परिवर्तन इसकी पहचान है - एक ही स्थान पर कुछ भी नहीं से एक नई निर्देशिका बनाई गई है। एक कार्यान्वयन स्तर पर, हाँ, सभी खुली फ़ाइलों को इनोड द्वारा पहचाना जाता है, और पुरानी और नई निर्देशिकाओं में अलग-अलग इनोड संख्या के साथ अलग-अलग इनोड होंगे।
हॉब्स

0

एक निर्देशिका, एक फ़ाइल की तरह, इसके साथ एक इनकोड जुड़ा होता है:

307% mkdir एबीसी

308% एलएस- आई 11997708 ए 11997709 बी 11997710 सी

एक इनोड एक डेटा संरचना है जिसमें निर्देशिका या फ़ाइल के बारे में जानकारी होती है। हर निर्देशिका और फ़ाइल में एक है। इसे एक पते के रूप में सोचें (वास्तव में एक सूचकांक संख्या)।

यदि मैं A में हूं, तो इनकोड संख्या 11997708 और दूसरे शेल में (या उसी शेल में जैसा कि करने जा रहा है) डायरेक्टरी ए को डिलीट करें और फिर इनोड को ls करें:

309% सीडी ए

310% rmdir ../ ए

311% mkdir ../ ए

312% ls -आई ।।

11997720 A 11997709 B 11997710 C

I नोड अलग है, इसलिए यदि यह हटाए गए निर्देशिका ए में एक फ़ाइल बनाने की कोशिश करता है:

313% इसे छूते हैं

स्पर्श: 'यह' स्पर्श नहीं कर सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं

क्योंकि मैं जिस निर्देशिका में हूं, वह अब इनकोड 11997720 से जुड़ी नहीं है - इसलिए जहां मैं वर्तमान में नहीं हूं उसका वैध पता / इंडेक्स - इनोड नहीं है। इस प्रकार त्रुटि।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.