मैं इस बारे में पढ़ रहा हूं कि कैसे लिनक्स कर्नेल में पाइप को लागू किया जाता है और मेरी समझ को मान्य करना चाहता है। यदि मैं गलत हूं, तो सही स्पष्टीकरण के साथ उत्तर का चयन किया जाएगा।
- लिनक्स में एक VFS होता है जिसे पिपिफ कहते हैं जो कर्नेल में रखा जाता है (उपयोगकर्ता स्थान में नहीं)
- pipefs में एक ही सुपर ब्लॉक होता है और इसे अपने मूल (
pipe:
) के साथ लगाया जाता है/
- अधिकतर फाइल सिस्टमों के विपरीत पिपिफ्स को सीधे नहीं देखा जा सकता है
- Pipefs के लिए प्रवेश
pipe(2)
syscall के माध्यम से होता है - ऑपरेटर (या किसी अन्य प्रक्रिया से मैन्युअल रूप से) के
pipe(2)
साथ पाइपिंग के लिए गोले द्वारा उपयोग किया जाने वाला syscall|
, pipefs में एक नई फ़ाइल बनाता है जो एक सामान्य फ़ाइल की तरह बहुत अधिक व्यवहार करता है - पाइप ऑपरेटर की बाईं ओर की
stdout
फ़ाइल पाइपिफ्स में बनाई गई अस्थायी फ़ाइल पर पुनर्निर्देशित हो गई है - पाइप ऑपरेटर के दाहिने हाथ की तरफ की
stdin
फाइल पाइपिफ्स पर फाइल पर सेट है - पिपेफ्स को मेमोरी में संग्रहीत किया जाता है और कुछ कर्नेल जादू के माध्यम से, पृष्ठांकित नहीं किया जाना चाहिए
क्या यह स्पष्टीकरण है कि कैसे पाइप (जैसे ls -la | less
) बहुत अधिक सही कार्य करते हैं?
एक बात मुझे समझ में नहीं आती है कि कैसे बैश जैसी कोई चीज एक प्रक्रिया तय करती है ' stdin
या stdout
फाइल डिस्क्रिप्टर द्वारा लौटा दी जाती है pipe(2)
। मैं अभी तक उस बारे में कुछ भी नहीं जान पाया हूं।
हां, मैं विशेष रूप से निचले स्तर के संचालन का उल्लेख कर रहा हूं, इस धारणा के साथ कि
—
ब्रैंडन वंबोल्ड
|
ऑपरेटर बस pipe(2)
एक प्रक्रिया के रूप में कॉल कर रहा है जैसे बैश करता है।
pipe()
मशीनरी है कि समर्थन करता है यह (के साथ साथ कर्नेल कॉलpipefs
, आदि) से काफी कम स्तर है|
ऑपरेटर अपने खोल में की पेशकश की। उत्तरार्द्ध आमतौर पर पूर्व का उपयोग करके कार्यान्वित किया जाता है, लेकिन यह होना जरूरी नहीं है।