विभिन्न प्रक्रियाओं में एक ही fd एक ही फाइल की ओर कैसे संकेत कर सकता है?


25

कहो कि मेरे पास प्रक्रिया 1 है और प्रक्रिया 2 है । दोनों में पूर्णांक 4 के अनुरूप एक फाइल डिस्क्रिप्टर है।

हालाँकि हर प्रक्रिया में फ़ाइल डिस्क्रिप्टर 4 कर्नेल के ओपन फाइल टेबल में पूरी तरह से अलग फाइल की ओर इशारा करता है:

यहाँ छवि विवरण दर्ज करें

वो कैसे संभव है? क्या फाइल डिस्क्रिप्टर को ओपन फाइल टेबल में रिकॉर्ड करने के लिए सूचकांक नहीं माना जाता है?


1
अच्छा प्रश्न! मेरा अनुमान है कि फ़ाइल डिस्क्रिप्टर का अनुवाद किया गया है, ताकि 4दोनों प्रक्रियाओं में fd यह खुले fd की संख्या के सापेक्ष हो। Fd's 0-2(stdin, stdout, sdterr) हमेशा एक नई प्रक्रिया के लिए खोले जाते हैं और संख्या केवल इस प्रक्रिया के लिए आरक्षित नहीं होती है।


@ jw013 मैंने सोचा कि यह परिचित लग रहा था। \ _Pithikos यह कैसे एक डुप्लिकेट नहीं है?
माइकल Mrozek

1
यह एक खराब आरेख है - यह दिखाना चाहिए कि फ़ाइल डिस्क्रिप्टर 4 का अर्थ है चौथी प्रविष्टि [अच्छी तरह से, पांचवें, इसे शून्य से गिना जाता है] बाईं ओर फ़ाइल डिस्क्रिप्टर तालिका का नहीं, एक प्रविष्टि है जिसमें "4" नहीं है। वास्तविक "4" आपके यूजरस्पेस चर में रहता है जिसमें संख्या होती है। अन्य प्रश्न में आरेख बेहतर है।
रैंडम 832

2
@ Random832 अगर मुझे पता होता कि कौन सा डायग्राम सही है तो मैंने शायद यह सवाल कभी नहीं किया होगा।
पिथिकोस

जवाबों:


35

फ़ाइल डिस्क्रिप्टर, यानी 4आपके उदाहरण में, प्रक्रिया-विशिष्ट फ़ाइल डिस्क्रिप्टर तालिका में सूचकांक है , कि खुली फ़ाइल तालिका। फ़ाइल डिस्क्रिप्टर प्रविष्टि में कर्नेल की वैश्विक खुली फ़ाइल तालिका में एक प्रविष्टि के साथ-साथ फ़ाइल डिस्क्रिप्टर फ़्लैग का एक सूचकांक भी शामिल है


2
रिकॉर्ड के लिए, अधिकांश सिस्टमों पर केवल एक "फ़ाइल डिस्क्रिप्टर ध्वज" है, क्लोज़-ऑन-एक्ज़िक फ़्लैग। अन्य सभी "प्रति-एफडी" राज्य (ऑफसेट और एक्सेस मोड सहित) खुली फ़ाइल टेबल प्रविष्टि का हिस्सा है।
रैंडम 832

24

प्रत्येक प्रक्रिया की अपनी फाइल डिस्क्रिप्टर तालिका होती है। फाइल डिस्क्रिप्टर 4 इन प्रोसेस 1234 पॉइंट्स इनसाइड प्रोसेस 1234 टेबल। 5678 की तालिका के अंदर प्रक्रिया के 5678 अंक में फाइल डिस्क्रिप्टर 4। ऐसा मामला जिससे आप परिचित होना चाहिए, वह फाइल डिस्क्रिप्टर 0, 1 और 2 हैं जो प्रत्येक प्रक्रिया के लिए मानक इनपुट, मानक आउटपुट और मानक त्रुटि हैं, जो इंगित करते हैं कि ये कहाँ तक अनुप्रेषित किए गए थे।

एक प्रक्रिया एक ही फ़ाइल को एक से अधिक बार खोल सकती है। यह संयोग से हो सकता है, उदाहरण के लिए जब एक प्रक्रिया के मानक आउटपुट और मानक त्रुटि को एक ही टर्मिनल या एक ही फ़ाइल पर पुनर्निर्देशित किया जाता है। अंतर्निहित फ़ाइल तालिका प्रविष्टियाँ (जैसे लिनक्स कीstruct file ) फ़ाइल के बारे में अधिक जानकारी रखती हैं; उनके पास उद्घाटन मोड (जैसे पढ़ने या लिखने) और अन्य राज्य (जैसे झंडे, उदाहरण के लिए बंद-निष्पादन) भी हैं। उदाहरण के लिए, एक प्रक्रिया में केवल फ़ाइल डिस्क्रिप्टर 0 पर पढ़ने के लिए एक टर्मिनल खोला जा सकता है और वही टर्मिनल केवल फाइल डिस्क्रिप्टर पर लिखने के लिए खोला जाता है। फ़ाइल टेबल प्रविष्टियों में फ़ाइल में प्रक्रिया की स्थिति भी होती है; एक प्रक्रिया एक lseekही फ़ाइल में दो अलग-अलग पदों के लिए हो सकती है , और इसलिए dupउस फ़ाइल को दो हैंडल प्राप्त करने के लिए उपयोग करेगी ।


2
यह पूरी तरह से सही नहीं है। मैन पेज / स्पेक्स के अनुसार, dupटिन पर जैसा कहता है, वैसा ही करता है: दोनों परिणामी डिस्क्रिप्टर एक ही फाइल टेबल एंट्री की ओर इशारा करते हैं और इस तरह एक ही ऑफसेट साझा करते हैं। 2 भिन्न फ़ाइल तालिका प्रविष्टियाँ प्राप्त करने के लिए, मुझे पूरा यकीन है कि आपको openदो बार फ़ाइल की आवश्यकता है ।
jw013

@ गिल्स "फाइल डिस्क्रिप्टर 4 प्रोसेस 1234 पॉइंट इनसाइड प्रोसेस 1234 टेबल"। आपका मतलब किस टेबल से है? मैं इस प्रक्रिया में एकमात्र तालिका जानता हूं जिसमें से फाइल डिस्क्रिप्टर तालिका है जहां प्रत्येक रिकॉर्ड कर्नेल की सिंगल ओपन फाइल टेबल की ओर इशारा करता है
पिथिकोस

अधिक सटीक विवरण के लिए unix.stackexchange.com/questions/195057/… देखें ।
गिल्स एसओ- बुराई को रोकें '

8

प्रत्येक प्रक्रिया की अपनी फाइल डिस्क्रिप्टर तालिका होती है। बस इतना ही।

यदि आप इसे गहराई से सीखना चाहते हैं, तो यह सब बहुत अच्छी तरह से रिचर्ड स्टीवंस द्वारा UNIX नेटवर्क प्रोग्रामिंग में वर्णित है ।


आप किस तालिका का उल्लेख कर रहे हैं?
पिथिकोस

1
फाइल डिस्क्रिप्टर टेबल
मिशैल ptrajer

7

अप्रत्यक्ष स्तर का एक अतिरिक्त स्तर आपकी समस्या को ठीक नहीं करेगा? ("कंप्यूटर प्रोग्रामिंग में सभी समस्याओं को अतिरिक्त स्तर के अप्रत्यक्ष रूप से हल किया जा सकता है" - कुछ बुद्धिमान ग्रेबर्ड)। यही है, प्रत्येक प्रक्रिया में छोटा पूर्णांक "ओपन फाइल टेबल" में कर्नेल-स्पेस इंडेक्स की प्रति-प्रक्रिया सरणी में एक सूचकांक के रूप में समाप्त होता है।


2
स्रोत बुद्धिमान बूढ़ा होने की संभावना डेविड व्हीलर है। ऐसा प्रतीत होता है कि उन्होंने यह भी कहा, " लेकिन यह आमतौर पर एक और समस्या पैदा करेगा। " :)
jw013
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.