लिनक्स कर्नेल में FIFO, पाइप और यूनिक्स डोमेन सॉकेट समान हैं?


30

मैंने सुना है कि एफआईएफओ का नाम पाइप है। और उनका भी वही शब्दार्थ है। दूसरी ओर, मुझे लगता है कि यूनिक्स डोमेन सॉकेट पाइप के समान है (हालांकि मैंने इसका उपयोग कभी नहीं किया है)। इसलिए मुझे आश्चर्य है कि अगर वे सभी लिनक्स कर्नेल में एक ही कार्यान्वयन का उल्लेख करते हैं। कोई उपाय?


नीचे दिए गए उत्तर से मैंने महसूस किया कि मेरा प्रश्न अस्पष्ट है और इसका उत्तर दिया जाना कठिन है। यह संभव है कि कोई भी कर्नेल में कार्यान्वयन के सामान के इतने सारे विवरण (यहां तक ​​कि कर्नेल डेवलपर्स के लिए) नहीं जान सकता है। यदि कोई इस बात की पुष्टि कर सकता है कि यूनिक्स डोमेन सॉकेट, पाइप और फीफो वे सभी लिनक्स के तहत साझा मेमोरी में भेजे जा रहे डेटा को बफर करते हैं, तो मेरा प्रश्न हल हो जाता है। खैर ... आंशिक रूप से हल।
जस्टिन

FIFO = नामित पाइप! = पाइप। FIFOs सॉकेट जोड़ी की तरह द्विदिश हो सकते हैं। नियमित पाइप यूनिडायरेक्शनल हैं। सभी में फ़ाइल इंटरफ़ेस और फ़ाइल शब्दार्थ हैं। आपके लिए कार्यान्वयन क्यों मायने रखता है?
पीएसकोकिक

मुझे पता है कि पाइप परिपत्र बफ़र हैं, और यह कि STREAMS प्रणाली के साथ, ये साझा कार्यान्वयन हो सकते हैं, हालांकि लिनक्स डिफ़ॉल्ट रूप से STREAMS का उपयोग नहीं करता है। मेरा मानना ​​है कि लिनक्स इन आईपीसी चैनलों को हार्डकोड करता है। हालांकि, मुझे जाँच करने का मन नहीं है। : D तुम क्यों नहीं? कोड सार्वजनिक रूप से उपलब्ध है।
पीएसकोकिक

यदि वे सभी समान कार्यान्वयन साझा करते हैं, तो उनकी दक्षता एक दूसरे के करीब होनी चाहिए। और, मेरे लिए, कर्नेल कोड समझना बहुत कठिन है।
जस्टिन

जवाबों:


35

UNIX डोमेन सॉकेट और FIFO उनके कार्यान्वयन का कुछ हिस्सा साझा कर सकते हैं, लेकिन वे वैचारिक रूप से बहुत अलग हैं। FIFO बहुत निम्न स्तर पर कार्य करता है। एक प्रक्रिया पाइप में बाइट्स लिखती है और दूसरा इसे पढ़ता है। एक यूनिक्स डोमेन सॉकेट में टीसीपी / आईपी सॉकेट के समान व्यवहार होता है।

एक सॉकेट द्विदिश है और एक साथ कई प्रक्रियाओं द्वारा उपयोग किया जा सकता है। एक प्रक्रिया एक ही सॉकेट पर कई कनेक्शनों को स्वीकार कर सकती है और एक साथ कई ग्राहकों को शामिल कर सकती है। कर्नेल हर बार एक नई फ़ाइल डिस्क्रिप्टर देता है connect(2)या accept(2)सॉकेट पर कॉल किया जाता है। पैकेट हमेशा सही प्रक्रिया में जाएंगे।
एक FIFO पर, यह असंभव होगा। द्विदिश संचार के लिए, आपको दो FIFO की आवश्यकता होती है, और आपको अपने प्रत्येक क्लाइंट के लिए FIFOs की एक जोड़ी की आवश्यकता होती है। चयनात्मक तरीके से लिखने या पढ़ने का कोई तरीका नहीं है, क्योंकि वे संवाद करने के लिए बहुत अधिक आदिम तरीका है।

अनाम पाइप और एफआईएफओ बहुत समान हैं। अंतर यह है कि अनाम पाइप फाइल सिस्टम पर फाइलों के रूप में मौजूद नहीं है इसलिए कोई प्रक्रिया नहीं हो सकती open(2)है। उनका उपयोग उन प्रक्रियाओं द्वारा किया जाता है जो उन्हें किसी अन्य विधि द्वारा साझा करते हैं। यदि एक प्रक्रिया एक एफआईएफओ खोलती है और फिर प्रदर्शन करती है, उदाहरण के लिए, एक fork(2), इसका बच्चा अपने फाइल डिस्क्रिप्टर और, उनमें से, पाइप को इनहेरिट करेगा।

UNIX डोमेन सॉकेट, अनाम पाइप और FIFOs समान हैं, वे साझा मेमोरी सेगमेंट का उपयोग करते हैं। कार्यान्वयन का विवरण एक प्रणाली से दूसरे में भिन्न हो सकता है, लेकिन विचार हमेशा समान होता है: मेमोरी के समान हिस्से को दो अलग-अलग प्रक्रियाओं में मेमोरी मैपिंग में संलग्न करें जिससे उन्हें डेटा साझा किया जा सके
( संपादित करें: जो कि इसे लागू करने का एक स्पष्ट तरीका होगा लेकिन वह है न कि यह वास्तव में लिनक्स में कैसे किया जाता है, जो केवल बफ़र्स के लिए कर्नेल मेमोरी का उपयोग करता है, नीचे @ tjb63 द्वारा उत्तर देखें)।
कर्नेल तब सिस्टम कॉल को संभालता है और तंत्र को सार करता है।


"UNIX डोमेन सॉकेट और FIFO अपने कार्यान्वयन के कुछ हिस्से को साझा कर सकते हैं" ... बिंदु "कुछ का हिस्सा है" ... मुझे एहसास हुआ कि मेरा प्रश्न अस्पष्ट है और इसका उत्तर दिया जाना कठिन है। यह संभावना है कि कोई भी यह नहीं जान सकता है कि वे कर्नेल में (कर्नेल डेवलपर्स के लिए भी) कौन से हिस्से साझा करते हैं। फिर भी ... क्या कोई पुष्टि कर सकता है कि यूनिक्स डोमेन सॉकेट, पाइप और फीफो वे सभी डेटा को लिनक्स के तहत साझा मेमोरी में भेजे जा रहे हैं? यदि इसकी पुष्टि हो जाती है, तो मेरा प्रश्न हल हो जाता है। खैर ... आंशिक रूप से हल।
जस्टिन

ठीक है, हाँ, कर्नेल द्वारा प्रबंधित एक बफर है। उदाहरण के लिए, एफआईएफओ के साथ, आप लेखक को मार सकते हैं और पाठक अभी भी वही कर सकता है जो लेखक की मृत्यु से पहले पाइप में भेजा गया था। सॉकेट्स के साथ, यह थोड़ा अधिक जटिल है क्योंकि वे एक जुड़े प्रोटोकॉल के साथ कार्य करते हैं। लेकिन अगर आप सॉकेट के लिए एक इंट, कहते हैं, और फिर स्कोप से बाहर निकलते हैं, तो प्रेषक स्टैक से इंट को साफ़ किया जाता है, तो रिसीवर इसे पढ़ सकता है। तो, स्पष्ट रूप से कहीं एक बफर है।
lgeorget

टिप्पणी को फिर से पढ़ना, सुनिश्चित नहीं है कि मैं यहाँ स्पष्ट हूँ ... मुझे बताएं कि क्या अभी भी कुछ स्पष्ट नहीं है।
लार्जेट

आपकी टिप्पणी मेरे लिए स्पष्ट है।
जस्टिन

7

यहाँ इसकी काफी अच्छी चर्चा है: http://www.slideshare.net/divyekapoor/linux-kernel-implementation-of-pipes-and-fifos

अब तक, मैं देख सकता हूं, दोनों प्रस्तुति स्लाइड्स से, और स्रोत @ http://lxr.free-electrons.com/source/fs/pipe.c - फीफो पाइप के चारों ओर एक आवरण के रूप में कार्यान्वित किया जाता है, और पाइप स्वयं हैं pipefs वर्चुअल फाइलसिस्टम के माध्यम से कार्यान्वित किया गया।

@lgeorget - पाठकों और लेखकों के बीच बफ़र्स के लिए कर्नेल मेमोरी का उपयोग करने के लिए पाइप दिखाई देते हैं - वे इस तरह के रूप में 'साझा मेमोरी' का उपयोग नहीं करते हैं, और उपयोगकर्ता और कर्नेल एड्रेस स्पेस (जैसे, pipe_readकॉल pipe_iov_copy_to_user, जिसे कॉल __copy_to_user_inatomicया ( copy_to_user) के बीच मेमोरी कॉपी करते हैं । __copy_to_user_inatomicकॉल copy_user_genericहै, जो कई एएसएम कार्यान्वयन के पर है।


4

एक "FIFO" और एक " नामित पाइप" एक ही बात है - हालांकि यह काफी अलग है कि कमांड लाइन पर दो कमांड के बीच एक शेल "पाइप" (!) को कैसे संभालता है।

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


1
हां, यूनिक्स डोमेन सॉकेट सॉकेट की तरह है, इसलिए यह एपीआई अन्य सॉकेट एपीआई जैसे टीसीपी या यूडीपी, आदि के समान है। हालांकि, यूनिक्स डोमेन सॉकेट का उपयोग केवल "स्थानीय" आईपीसी के रूप में किया जा सकता है। और जिस तरह से यह डेटा ट्रांसफर करता है वह पहली बार पहले तरीके से है, बहुत ज्यादा फीफो और पाइप की तरह। तो मुझे लगता है कि यह संभव है यूनिक्स डोमेन सॉकेट का एपीआई समान कार्यान्वयन का सिर्फ एक और एनकैप्सुलेशन है इसलिए हम इसका उपयोग ऐसे करते हैं जैसे कि यह सॉकेट हो। मुझे लगता है कि यह संभव है कि वे सभी एक ही आंतरिक कर्नेल में साझा करें ... मैं पुष्टि करना चाहता हूं कि यह सच है या नहीं।
जस्टिन

1

मुझे नहीं लगता कि जस्टिन। अगर मुझसे गलती नहीं हुई है, और मैं संभवतः संभवतः हूं, तो मुझे लगता है कि फीफो डिस्क पर एक फ़ाइल का उपयोग करते हैं, और यूनिक्स डोमेन सॉकेट कर्नेल मेमोरी का उपयोग करते हैं।

इसके अलावा, उपरोक्त पोस्टर के अतिरिक्त, जिन्होंने उल्लेख किया है कि यूनिक्स डोमेन सॉकेट्स द्वि-दिशात्मक हैं, जो केवल SOCK_STREAM सॉकेट का उपयोग करते समय होता है। SOCK_DGRAM यूनिक्स डोमेन सॉकेट, वास्तव में, यूनि-दिशात्मक हैं, और केवल उस कोड से भेज () सकते हैं जिसे कनेक्ट () कहा जाता है, जिसे बाइंड () कहा जाता है।

बेशक, कोड जिसे कनेक्ट कहा जाता है () को इसे स्वयं समापन बिंदु बनाने के लिए बाइंड () भी कॉल करना होगा, लेकिन इसका आपके प्रश्न से कोई लेना-देना नहीं है।


3
StackExchange पर आपका स्वागत है, और पोस्ट करने के लिए धन्यवाद। कुछ टिप्पणी ... 1) यदि आप "काफी संभवतः" गलत हैं, तो आपको जवाब देने से पहले दो बार जांच करनी चाहिए; यह साइट एक मंच नहीं है और न ही चैट है। 2) डेटाग्राम ओरिएंटेड सॉकेट्स 3 पर आपकी शुद्धता के लिए धन्यवाद) प्रश्न के साथ "कुछ भी नहीं करने" के लिए कुछ पोस्ट करने की आवश्यकता नहीं है। :)
lgeorget

1

मेरे 2 सेंट ... एफआईएफओ और यूनिक्स सॉकेट दोनों द्वि-दिशात्मक (समान) हैं लेकिन सॉकेट में एक स्टार टोपोलॉजी है जबकि एक एफआईएफओ सिर्फ एक कतार है (और इसलिए एक दूसरे को प्रतिस्थापित नहीं कर सकते हैं), हां उनका कार्यान्वयन आंतरिक रूप से कोड साझा कर सकता है।

**

char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
fd = open(myfifo, O_RDWR);   //so that you can read/write to it
 ...
write(fd, buff1, sizeof(buff1));  
getchar();//wait till some one reds this and writes something else
int sz=read(fd, buff1, sizeof(buff1));  //read that something**

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