`Mknod` और FIFO द्वारा निर्मित नामित पाइप` mkfifo` समकक्ष द्वारा बनाए गए हैं?


22

मैंने mkfifo <file>FIFOs नाम बनाने के लिए कमांड का उपयोग किया है , जहां एक प्रक्रिया फ़ाइल को लिखती है, और दूसरी प्रक्रिया फ़ाइल से पढ़ती है।

अब, मुझे पता है कि mknodकमांड नामित पाइप बनाने में सक्षम है। क्या ये नामित पाइप FIFOs द्वारा बनाए गए समान हैं mkfifo, या क्या उनके पास अलग-अलग विशेषताएं हैं?

जवाबों:


29

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

mkfifo foobar
# same difference
mknod foobar p

में straceयह दोनों आदेश के लिए समान है:

mknod("foobar", S_IFIFO|0666)           = 0

तो syscalls के संदर्भ में, mkfifoवास्तव में के लिए आशुलिपि है mknod

सबसे बड़ा अंतर, शब्दार्थ में है। साथ mkfifoआप एक ही बार में FIFOs का एक समूह बना सकते हैं:

mkfifo a b c

चूंकि mknod, आपको टाइप निर्दिष्ट करना है, यह केवल एक तर्क को स्वीकार करता है:

# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p

सामान्य तौर पर, mknodसही ढंग से उपयोग करना मुश्किल हो सकता है। तो अगर आप FIFO के साथ काम करना चाहते हैं, तो छड़ी करें mkfifo


16
हालांकि, ओपी निश्चित रूप से परवाह नहीं करता है, क्योंकि क्यू को टैग नहीं किया गया है [linux], ध्यान दें कि बीएसडी पर mkfifo(2) वास्तव में एक अलग सिस्टम कॉल है mknod(2)(लेकिन यह बिल्कुल वही काम करेगा mknod(S_FIFO))।
मच्छी जूल

@frostschutz - एक उत्कृष्ट उत्तर के लिए धन्यवाद। तो बस चीजों को स्पष्ट करने के लिए। mkfifoऔर mknodवास्तव में mknodएक FIFO बनाने के लिए सिस्टम कॉल (आज से पहले उस सिस्टम कॉल का पता नहीं था) का उपयोग करके कार्यक्रम हैं । आप "एफआईएफओ" और "नामित" नाम का उपयोग करते हैं। क्या ये एक ही चीज हैं? द्वि-दिशात्मक नामित पाइप यूनिक्स डोमेन सॉकेट के माध्यम से कार्यान्वित किए जाते हैं, है ना?
शूजेंग जू

हां, "नामित पाइप" और एफआईएफओ आमतौर पर एक ही चीज को संदर्भित करता है (पाइप के संदर्भ में - एफआईएफओ एक अवधारणा है जो पाइप के बाहर भी मौजूद है)। एक सॉकेट पूरी तरह से एक अलग जानवर है, कुछ दिलचस्प जवाब यहाँ हैं: unix.stackexchange.com/q/75904/30851
frostschutz

@frostschutz - धन्यवाद। मुझे लगता है कि मुझे सबसे अधिक उलझन में है, जब मैं नामित पाइपों के बारे में सोचता हूं, तो मैं द्वि-दिशात्मक पाइपों के बारे में भी सोचता हूं - और एक फीफो निश्चित रूप से द्वि-दिशात्मक (AFAIK) नहीं है।
शूजेंग

@ शुज़ेंग एक फीफो के पास वास्तव में दिशा पर कोई नियम नहीं है। यह वास्तव में सिर्फ पढ़ने और लिखने के लिए है। पाठकों और लेखकों की कोई भी संख्या हो सकती है, लेकिन लिखित कुछ भी केवल एक बार पढ़ा जा सकता है, इसलिए यह स्पष्ट नहीं है कि अंत में डेटा किसे मिलेगा।
फ्रॉस्ट्सचुटज़

18

पोर्टेबिलिटी के चरम किनारों को छोड़कर वे समान हैं। mknod ... pमूल रूप से नामित पाइप बनाने का एकमात्र तरीका था, लेकिन POSIX ने इसे छोड़ना और mkfifoइसके बजाय आविष्कार करना चुना , संभवतः क्योंकि नामित पाइप उन सभी की तुलना में स्वाभाविक रूप से अधिक पोर्टेबल अवधारणा है जो अन्य सामान mknodउपकरणों और उनके प्रमुख और मामूली संख्याओं के साथ कर सकते हैं। mknodसिस्टम कॉल भी POSIX के प्रारंभिक verions के बाहर छोड़ दिया गया था।

तो, प्राचीन UNIX के लिए पोर्टेबिलिटी के लिए, mknod ... pबेहतर है। आधुनिक प्रणालियों के लिए, mkfifoयह थोड़ा बेहतर है, हालांकि यह बहुत कम संभावना है कि आप एक वास्तविक आधुनिक यूनिक्स पाएंगे जहां mknod ... pकाम नहीं करता है।

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