2010-08-13 15 views
9

पढ़ें (2) और लिखना (2) सॉकेट डिस्क्रिप्टर के साथ-साथ फ़ाइल डिस्क्रिप्टर पर दोनों काम करता है। फ़ाइल डिस्क्रिप्टर के मामले में, उपयोगकर्ता फ़ाइल डिस्क्रिप्टर तालिका-> फ़ाइल तालिका और आखिरकार इनोड तालिका में जहां यह फ़ाइल प्रकार (नियमित फ़ाइल/char/block) के लिए जांचता है, और तदनुसार पढ़ता है। चार स्प्ल फ़ाइल के मामले में, यह चार डिवाइस स्विच से फ़ाइल की बड़ी संख्या के आधार पर फ़ंक्शन पॉइंटर्स प्राप्त करता है और डिवाइस के लिए पंजीकृत उचित पढ़ने/लिखने के दिनचर्या को कॉल करता है। ब्लॉक ब्लॉक स्विच से फ़ंक्शन पॉइंटर्स प्राप्त करके ब्लॉक विशेष फ़ाइल के लिए उचित पढ़ने/लिखने की नियमित रूप से कॉल किया जाता है।सॉकेट डिस्क्रिप्टर बनाम फ़ाइल डिस्क्रिप्टर

क्या आप कृपया मुझे बता सकते हैं कि सॉकेट डिस्क्रिप्टर पर पढ़ने/लिखने पर क्या होता है। यदि सॉकेट डिस्क्रिप्टर पर पढ़/लिखने का काम करता है, तो क्या हम वर्णनकर्ता प्राप्त करने के लिए सॉकेट के बजाय खुले उपयोग नहीं कर सकते?

+0

आपको नहीं बता सकते हैं ** बिल्कुल ** क्या होता है (कर्नेल स्रोत पर देख रहे हैं अगर तुम सच में जानना चाहते कोशिश), लेकिन अनिवार्य रूप से यह पारित करेंगे टीसीपी चालक के लिए अनुरोध, जो नेटवर्क इंटरफेस कार्ड के लिए ड्राइवर तक पहुंचने तक नेटवर्क स्टैक को आगे बढ़ाएगा। यदि आप जानना चाहते हैं कि नेटवर्क स्टैक की प्रत्येक परत सामान्य शर्तों में क्या करती है, तो * ओएसआई मॉडल * देखें। 'ओपन' बनाम 'सॉकेट' के लिए: वे अलग-अलग तर्क लेते हैं, क्योंकि निर्दिष्ट करने की आवश्यकता वाली जानकारी अलग-अलग होती है कि आप फ़ाइल या सॉकेट खोलना चाहते हैं या नहीं। – David

+0

मैं जानना चाहता हूं कि सॉकेट() को कॉल करने पर आवंटित डेटा संरचना क्या है, इनोड तालिका में कौन सी जानकारी संग्रहीत की जाती है, यह अंततः नेटवर्क इंटरफेस कार्ड ड्राइवर दिनचर्या को पढ़ने/लिखने पर कॉल करने के लिए कैसे पहुंचती है –

+0

नोट सिस्टम कॉल को पढ़ने/लिखने के लिए नोट करें। अधिकांश काम कर्नेल अंतरिक्ष में किया जाता है। कि तरह का अमूर्तता, या "वर्चुअलाइजेशन": बस ब्लॉक फ़ाइल, सॉकेट, या कई अन्य चीजें, "फ़ाइल" के रूप में लें। एक फ़ाइल में पढ़ने, लिखने, खुले इत्यादि जैसे ऑपरेशन होते हैं लेकिन एक सॉकेट पढ़ने या डिस्क फ़ाइल पढ़ने का असली कार्यान्वयन कर्नेल में परिभाषित किया जाता है। यदि आपको आवश्यकता हो तो फ़ाइल से पढ़ने के लिए आप "लिखने" को भी परिभाषित कर सकते हैं। – tristan

उत्तर

2

सॉकेट डिस्क्रिप्टर फ़ाइल संरचनाओं से भी जुड़े हुए हैं, लेकिन उन संरचनाओं के लिए file_operations कार्यों का एक सेट सामान्य से अलग है। उन वर्णनकर्ताओं का प्रारंभ और उपयोग इसलिए अलग है। कर्नेल-स्तरीय इंटरफ़ेस का हिस्सा पढ़ें और लिखें, बिल्कुल ठीक समकक्ष हुआ।

+0

मैं जानना चाहता हूं कि सॉकेट() को कॉल करने पर आवंटित डेटा संरचना क्या है, इनोड टेबल में कौन सी जानकारी संग्रहीत की जाती है, यह अंततः नेटवर्क इंटरफ़ेस कार्ड चालक के दिन तक पहुंचने पर कैसे पढ़ता है/लिखने पर –

+0

नहीं होता है, बल्कि जानबूझकर समान होने के लिए बनाया जाता है – Yerken

0

कुछ राज्यों में कुछ प्रकार के सॉकेट के लिए पढ़ने और लिखना मान्य है; यह सब कर्नेल के अंदर पारित विभिन्न structs पर निर्भर करता है।

सिद्धांत रूप में, खुले() सॉकेट डिस्क्रिप्टर बना सकते हैं, लेकिन बीएसडी सॉकेट एपीआई को इस तरह से परिभाषित नहीं किया गया था।

कुछ अन्य (कुछ हद तक लिनक्स-विशिष्ट) फ़ाइल डिस्क्रिप्टर प्रकार हैं जो खुले() के अलावा सिस्टम कॉल द्वारा खोले जाते हैं, उदाहरण के लिए epoll_create या timerfd_create। ये वही काम करते हैं।

6

जैसा कि मुझे स्मृति में पता है, फाइल डिस्क्रिप्टर में इस fd के फ़ाइल-सिस्टम प्रकार की पहचान करने के लिए ध्वज शामिल होगा। कर्नेल इसी हैंडलर फ़ंक्शन का आह्वान करेगा फ़ाइल-सिस्टम प्रकार पर निर्भर करता है। आप linux कर्नेल में स्रोत read_write.c स्रोत देख सकते हैं।

होना करने के लिए संक्षेप में बात करते हैं, गिरी किया:

  1. -पढ़ने के लिए write.c में, वहाँ एक file_system_wrapper समारोह, कि कॉल इसी हैंडलर समारोह fd का फ़ाइल प्रकार पर निर्भर करता है (ext2/ext3/सॉकेट/..)
  2. सॉकेट.c में, एक socket_type_wrapper फ़ंक्शन है; जो संबंधित सॉकेट हैंडलर फ़ंक्शन को सॉकेट के प्रकार (आईपीवी 4, आईपीवी 6, एटीएम अन्य) पर निर्भर करता है
  3. सॉकेट_आईपीवी 4 सी में, प्रोटोकॉल_टाइप रैपर फ़ंक्शन होता है; जो प्रोटोकॉल हैंडलर फ़ंक्शन पर कॉल करता है प्रोटोकॉल tpye (udp/tcp)
  4. पर निर्भर करता है tcp_ip4.c में; tcp_sendmsg है और टीसीपी ipv4 प्रकार के एफडी को लिखते समय यह फ़ंक्शन कॉल किया जाएगा।

आशा यह स्पष्ट रूप से, धन्यवाद, Houcheng

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