क्या यूनिक्स इंटरनेट सॉकेट फाइलें हैं?


23

मैं समझता हूं कि "सब कुछ एक फाइल है" यूनिक्स की प्रमुख अवधारणाओं में से एक है, लेकिन सॉकेट विभिन्न एपीआई का उपयोग करते हैं जो कि कर्नेल द्वारा प्रदान किए जाते हैं (जैसे सॉकेट, Sendto, recv, आदि), सामान्य फ़ाइल सिस्टम इंटरफेस की तरह नहीं।

यह "सब कुछ एक फाइल है" यहां कैसे लागू होता है?

जवाबों:


26

सॉकेट विभिन्न APIs का उपयोग करते हैं

यह पूरी तरह सच नहीं है। सॉकेट के साथ उपयोग के लिए कुछ अतिरिक्त कार्य हैं, लेकिन आप सामान्य सॉकेट fd पर , जैसे, सामान्य read()और उपयोग कर सकते हैं write()

यह कैसे "सब कुछ एक फ़ाइल है" यहां लागू होता है?

इस अर्थ में कि एक फ़ाइल विवरणक शामिल है।

यदि आपकी "फाइल" की परिभाषा एक फाइल सिस्टम में संग्रहीत बाइट्स का एक असतत अनुक्रम है, तो सब कुछ एक फाइल नहीं है। हालाँकि, अगर आपकी फ़ाइल की परिभाषा अधिक संभालती है जैसे - सूचना के लिए एक नाली, अर्थात, I / O कनेक्शन - तो "सब कुछ एक फ़ाइल है" अधिक समझ में आने लगती है। इन चीजों में अनिवार्य रूप से बाइट्स के अनुक्रम शामिल हैं, लेकिन वे कहाँ से आते हैं या संदर्भ में भिन्न हो सकते हैं।

यह वास्तव में सचमुच का इरादा नहीं है, हालांकि। एक डेमन एक फाइल नहीं है, एक डेमन एक प्रक्रिया है; लेकिन अगर आप IPC कर रहे हैं तो किसी अन्य प्रक्रिया से संबंधित आपके तरीके को फ़ाइल शैली संस्थाओं द्वारा कम किया जा सकता है।


5
मैं कहूंगा कि "सब कुछ एक फाइल है" का एक सटीक रीफ़्रेशिंग होना चाहिए "सभी इंटरफेस फाइलों के माध्यम से हैं"। आप फ़ाइलों के माध्यम से प्रक्रियाओं के साथ बातचीत करते हैं (स्टडिन / आउट / इरेट, / प्रोक / $ पीआईडी, आदि)। आप फ़ाइलों (सॉकेट्स / फ़ाइल डिस्क्रिप्टर) के माध्यम से नेटवर्क के साथ बातचीत करते हैं। आप एक फ़ाइल (/ देव / माउस) के माध्यम से माउस के साथ बातचीत करते हैं।
पैट्रिक

मैंने एक बार एक सॉकेट के हैंडल को क्लोन किया था / इसे बाहर से खोलकर।
जोशुआ

12

"सब कुछ एक फाइल है" सिर्फ एक ओवरस्टैमेंट है। यह 1970 के दशक में उपन्यास था और यह था यूनिक्स का एक प्राथमिक ख़ास विशेषता। लेकिन यह सिर्फ एक विपणन अवधारणा है, यूनिक्स की वास्तविक नींव नहीं है, क्योंकि यह स्पष्ट रूप से सच नहीं है। यह एक फ़ाइल के रूप में हर उपचार के लिए फायदेमंद या समझदार नहीं है।

सीपीयू एक फाइल है? क्या आपका प्रोग्राम एक नया निर्देश प्राप्त करने के लिए सीपीयू पढ़ता है ()? रैम एक फाइल है? क्या आपका प्रोग्राम अगले बाइट को पढ़ता है?

इसके बाद, वहाँ ओएस के प्रकार थे जो आपको फ्लॉपी डिस्क के लिए एक एपीआई और हार्ड डिस्क के लिए एक अलग एपीआई, चुंबकीय टेप के लिए एक अलग एपीआई और विभिन्न टर्मिनलों के लिए अलग-अलग एपीआई का एक गुच्छा और इतने पर। आईबीएम मेनफ्रेम सिस्टम में हार्ड डिस्क पर विभिन्न प्रकार की फाइलें थीं और आपको उनमें से हर एक को एक अलग एपीआई दिया गया था, यह विश्वास है या नहीं! तो UNIX "यह एक फ़ाइल है" दृष्टिकोण, साथ में "stdin / stdout / stderr" दृष्टिकोण, दोनों उपयोगकर्ताओं और प्रोग्रामर के लिए एक बहुत ही सुंदर अमूर्तता लाया।

नेटवर्क के साथ, यह विशेष अमूर्त सिर्फ काम नहीं किया। और कोई नुकसान नहीं है, बस ओएस की थोड़ी कम समग्रता और सुसंगतता। लेकिन यह काम करता है। क्या आपको /dev/myinternetz/www/google/com/tcp/80आज आपके सिस्टम पर कहीं भी एक फ़ाइल कहा जाता है? क्या आप इसे खोल सकते हैं (), इसे लिख सकते हैं () एक क्वेरी, और पढ़ सकते हैं () अच्छा HTML में जवाब? नहीं? ऐसा इसलिए है क्योंकि यह "एक फ़ाइल है" नेटवर्क के आसपास बातचीत करने के लिए अमूर्तता बहुत आसान नहीं थी। यह व्यवहार में बहुत अच्छा काम नहीं करेगा। कार्रवाई में टपका हुआ अमूर्त का कानून


9
मजेदार तथ्य: बैश के कुछ संस्करण आपको खोलने की अनुमति देंगे /dev/tcp/www.google.com/80। हालांकि यह वास्तविक फाइल नहीं है - बैश सिर्फ इसे फेक रहा है।
user253751

2
@ इमिब्स: अधिक बिंदु, यह एक फाइल सिस्टम बनाने के लिए यथोचित संभव होगा जो वास्तव में लागू करता है।
यहोशू

मुझे लगता है कि आप पढ़ सकते थे /dev/memया /dev/kmemयदि आप चाहते थे।
जेसन सी

4
ध्यान दें कि योजना 9 इसे और आगे ले जाती है, नेटवर्क प्रोटोकॉल एक छद्म फाइलसिस्टम के माध्यम से आपके / dev / myinternetz / www / google / com / tcp / 80 उदाहरण (पाठ्यक्रम के एक अलग रास्ते के साथ) के प्रभाव को संबोधित करते हैं। इसके अलावा, भौतिक रैम वास्तव में एक फ़ाइल की तरह बहुत काम करता है, आप अपने वर्चुअल एड्रेस स्पेस में मिमीैप रैम करते हैं जैसे कि आप इसमें एक फ़ाइल को मिमीप करते हैं। (इस विचार पर मॉलोक को लागू किया गया है)।
वैधता

1
योजना 9 "सब कुछ एक फाइल है" को चरम पर ले जाने के अलावा "सब कुछ नेटवर्क-पारदर्शी है" में कुछ बहुत शक्तिशाली निहितार्थ हैं। उदाहरण के लिए, NAT की कोई आवश्यकता नहीं है, आप बस अपने राउटर के टीसीपी / आईपी स्टैक (जो कि नेटवर्क-पारदर्शी फ़ाइल (सिस्टम) है) को अपने स्थानीय मशीन पर माउंट कर सकते हैं और अपने राउटर से सीधे पैकेट भेज सकते हैं।
जोर्ग डब्ल्यू मित्तग

7

सॉकेट फाइलें हैं। आप एक सॉकेट पर readऔर उपयोग कर सकते हैं write: वे कॉलिंग के साथ recvऔर उसके बराबर हैं । आप उन्हें बंद कर दें । यदि आपको फ़ाइल डिस्क्रिप्टर में फेरबदल करने की आवश्यकता है, तो आप उन्हें और दोस्तों के साथ चारों ओर ले जा सकते हैं । आप कुछ झंडे सेट कर सकते हैं , और कॉल करने के बाद stdio बफरिंग का उपयोग कर सकते हैं । सूची चलती जाती है। बहुत महत्वपूर्ण बात, आप सॉकेट सहित किसी भी प्रकार की फ़ाइल पर और कॉल कर सकते हैं, इसलिए ये फ़ंक्शन प्रोग्राम को तब तक अवरुद्ध करने की अनुमति देते हैं जब तक कि यह किसी भी तरह से फ़ाइल डिस्क्रिप्टर को सूचीबद्ध करके इनपुट प्राप्त नहीं करता है।sendflags=0closedupfcntlfdopenselectpoll

वहाँ कुछ सॉकेट प्रकार (के लिए अतिरिक्त सिस्टम कॉल कर रहे हैं recvऔर send, shutdown, आदि), वहाँ उपकरणों के लिए एक अतिरिक्त सिस्टम कॉल (है की तरह ioctl)।

सभी फ़ाइलों के नाम नहीं हैं , और जो ऐसा करते हैं, वे हमेशा निर्देशिका संरचना में नहीं रहते हैं। द्वारा बनाई गई पाइप pipe(जैसे शेल पाइप लाइन में) और द्वारा बनाई गई सॉकेट socketpairमें नाम नहीं हैं, लेकिन वे अभी भी फाइलें हैं। द्वारा बनाई गई सॉकेट्स socketका एक नाम है जिसका सिंटैक्स डोमेन पर निर्भर करता है। यह नाम एक struct sockaddrमें bindऔर अन्य कार्यों के लिए पारित किया गया है । यूनिक्स ( AF_UNIX) सॉकेट के लिए, नाम एक है struct sockaddr_un, जो एक परिवार और एक स्ट्रिंग है; स्ट्रिंग के आधार पर, यह एक फ़ाइल नाम हो सकता है (नाम सॉकेट mknodको कई यूनिक्स वेरिएंट पर बनाया जा सकता है ) या नहीं (अमूर्त नेमस्पेस)। IPv4 ( AF_INET) सॉकेट के लिए, नाम एक है struct sockaddr_in, जिसमें पोर्ट नंबर और आईपी एड्रेस, कॉल protocolसे प्लस है socket


7

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

# file live
live: socket
# stat live
File: `live'
  Size: 0               Blocks: 0          IO Block: 4096   socket
Device: fc03h/64515d    Inode: 198817      Links: 1
Access: (0660/srw-rw----)  Uid: (23129/  icinga)   Gid: (23130/icinga-cmd)
Access: 2014-11-07 09:27:59.000000000 -0800
Modify: 2014-11-05 09:27:03.000000000 -0800
Change: 2014-11-05 09:27:03.000000000 -0800

11/17। Linux के लिए अतिरिक्त जानकारी (ext3): एक सॉकेट में एक इनोड होता है (जो डिस्क पर 256-बाइट ब्लॉक होता है), लेकिन इसमें कोई डेटा ब्लॉक नहीं होता है (आप इनोड को निकालने और डेटा ब्लॉक पॉइंटर्स की जांच करके इसे सत्यापित कर सकते हैं; या) रनिंग डीबगफ़ 'स्टेट' जिसमें 0 का ब्लॉककाउंट दिखाया गया है)। तो, इसमें फ़ाइल मेटाडेटा (स्वामी, समूह, अनुमतियां, आदि) हैं, लेकिन डिस्क पर कोई डेटा सामग्री नहीं है। यह एक नियमित खाली फ़ाइल ( touch /tmp/foo) के समान है जिसमें 0. का एक ब्लॉकचेन भी है। पहले मामले में, इनोड में "प्रकार" फ़ील्ड "सॉकेट" दिखाता है; दूसरे मामले में यह "नियमित फ़ाइल" दिखाता है।

संदर्भ: ext2 इनोड संरचना ; stat, dumpe2fsऔर debugfsआज्ञा।


1
मैं बस चलाने के लिए fileया statइसे एक फ़ाइल बनाता है कुछ कहूँगा ।
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.