2011-09-22 10 views
6

में फ़ाइल डिस्क्रिप्टर के साथ सहायता प्रत्येक प्रक्रिया में फ़ाइल डिस्क्रिप्टर टेबल (एफडीटी) होती है और प्रत्येक फ़ाइल में फ़ाइल डिस्क्रिप्टर होता है। Stdin, stdout और stderr के लिए फ़ाइल वर्णनकर्ता 0,1, और 2. ये मान सभी प्रक्रियाओं के लिए समान हैं। एफडीटी मेरा मानना ​​है कि उन फाइलों की INODE प्रविष्टियों के संदर्भ शामिल हैं। फाइल डिस्क्रिप्टर प्रक्रियाओं में पुन: उपयोग किए जाते हैं यानी वे विश्व स्तर पर अद्वितीय नहीं हैं। क्या कर्नेल द्वारा बनाए गए वैश्विक एफडीटी है जिसमें प्रत्येक प्रक्रिया 'एफडीटी संदर्भ' है? Stdin, stdout और stderr के लिए एफडीटी क्या करता है? इन विशेष कुंजीपटल करने के लिए लिंक की गई फ़ाइलों रहे हैं, प्रदर्शित आदि लेख के लिए लिंक प्रदान करें, किताबें आदियूनिक्स

उत्तर

7

एक अच्छा प्रारंभिक बिंदु 2001 से लेख "A small trail through the Linux kernel" तंत्र अभी भी समान हैं, हालांकि कार्यान्वयन पर ले जाया गया है और a more recent kernel में सबसे अच्छा अध्ययन किया जाता है।

कर्नेल के अंदर प्रत्येक खुली फ़ाइल डिस्क्रिप्टर struct file से मेल खाता है, जिसमें खुली फ़ाइल या डिवाइस के बारे में सारी जानकारी होती है। फाइल डिस्क्रिप्टर वास्तव में प्रक्रिया के लिए एफडीटी में एक सूचकांक से अधिक नहीं है। लिनक्स कर्नेल में struct file फ़ंक्शन fd_install() द्वारा FDT से जुड़ा हुआ है। struct file को dup2 system call द्वारा किसी अन्य फ़ाइल डिस्क्रिप्टर को फिर से सौंप दिया जा सकता है।

प्रक्रियाएं उसी पीडीटी को साझा कर सकती हैं यदि clone सिस्टम कॉल CLONE_FILES ध्वज के साथ सिस्टम कॉल द्वारा बनाई गई थी, लेकिन कोई वैश्विक एफडीटी नहीं है। सामान्य fork ऑपरेशन एक नया एफडीटी बनाता है जो माता-पिता एफडीटी की एक प्रति है। इसका व्यावहारिक उपयोग बहु-थ्रेडेड अनुप्रयोग के प्रत्येक थ्रेड के लिए एक सामान्य एफडीटी साझा करने वाली क्लोन प्रक्रिया होने के लिए है, यह सुनिश्चित करना कि सभी थ्रेड एक ही पूर्णांक फ़ाइल वर्णनकर्ताओं का उपयोग कर सकें। यदि आप fork/exec का उपयोग करके एक नई प्रक्रिया बनाते हैं, तो नई प्रक्रिया उसी फ़ाइल डिस्क्रिप्टर से शुरू होती है लेकिन माता-पिता को प्रभावित किए बिना फ़ाइलों को खोल और बंद कर सकती है।

stdin, stdout, stderr के लिए एफडीटी प्रविष्टियां माता-पिता से विरासत में मिली हैं। इन तीन एफडीटी प्रविष्टियों के उनके कर्नेल कार्यान्वयन के बारे में कुछ खास नहीं है; उनका अर्थ सी पुस्तकालय द्वारा पारंपरिक उपयोग से आता है। अकेले माता-पिता की प्रक्रिया तय करती है कि वे किससे जुड़े हुए हैं। वे चरित्र उपकरणों से जुड़ सकते हैं, या वे फ़ाइलों या पाइप से जुड़े हुए हो सकते हैं। चरित्र डिवाइस के मामले के लिए, सबसे सामान्य एक टीटी या पीटीआई डिवाइस होना है। इन पुस्तकों की मुफ्त पुस्तक Linux Device Drivers में a good overview है।

+1

अनुच्छेद 3 के अंत में, मुझे लगता है कि आपका मतलब है कि एक बच्चा प्रक्रिया फाइलों को खोल और बंद कर सकती है * बिना * माता-पिता को प्रभावित –