इसमें सिस्टम प्रोग्रामिंग शामिल है, इसलिए यह एक बुनियादी सवाल से अधिक है। जैसा कि लिखा गया है, आपके मुख्य कार्यक्रम को बाहरी कार्यक्रम के साथ पूर्ण-डुप्लेक्स इंटरैक्शन की आवश्यकता नहीं है। Dataflow एक दिशा, अर्थात्
स्ट्रिंग बाहरी कार्यक्रम → मुख्य कार्यक्रम
इस पाइपलाइन का निर्माण सीधा है → में यात्रा करता है। पर्ल के open
में “Safe pipe opens” section of the perlipc documentation में एक उपयोगी मोड समझाया गया है।
इंटरप्रोसेस संचार के लिए एक और दिलचस्प दृष्टिकोण आपके एकल कार्यक्रम को मल्टीप्रोसेस बना रहा है और आपके बीच भी संवाद कर रहा है। open
फ़ंक्शन एक बहुत ही रोचक चीज़ करने के लिए "-|"
या "|-"
की फ़ाइल तर्क स्वीकार करेगा: यह आपके द्वारा खोले गए फ़ाइलहेडल से जुड़े बच्चे को फोर्क करता है। बच्चा माता-पिता के समान कार्यक्रम चला रहा है। उदाहरण के लिए, एक अनुमानित यूआईडी या जीआईडी के तहत चलते समय फ़ाइल को सुरक्षित रूप से खोलने के लिए यह उपयोगी है। यदि आप शून्य पर पाइप खोलते हैं, तो आप खोले गए फ़ाइलहेडल को लिख सकते हैं और आपका बच्चा इसे अपने STDIN
में ढूंढ पाएगा। यदि आप शून्य से पाइप खोलते हैं, तो आप जिस फ़ाइल को अपने बच्चे को STDOUT
पर लिखते हैं, आपने खोले गए फ़ाइलहेडल से पढ़ सकते हैं।
यह एक open
है जिसमें एक पाइप शामिल है, जो वापसी मूल्य को समझता है। perlfunc documentation on open
बताता है।
आप कमांड -
पर एक पाइप को खोलते हैं, एक अंतर्निहित fork
किया जाता है, तो खुला रिटर्न दो बार (कि, या तो |-
या -|
open
की एक या दो तर्क रूपों के साथ निर्दिष्ट किया जाता है): में अभिभावक प्रक्रिया यह बाल प्रक्रिया की पिड देता है, और बच्चे की प्रक्रिया में यह (एक परिभाषित) 0
देता है। open
सफल था या नहीं, यह निर्धारित करने के लिए defined($pid)
या //
का उपयोग करें।
मचान बनाने के लिए, हम सही-से-बाएँ क्रम हर कदम पर open
fork
करने के लिए एक नई प्रक्रिया का उपयोग करने में काम करते हैं।
- आपका मुख्य कार्यक्रम पहले से चल रहा है।
- अगला,
fork
एक प्रक्रिया जो अंततः बाहरी कार्यक्रम बन जाएगी। चरण 2
- पहले
fork
स्ट्रिंग-मुद्रण प्रक्रिया से प्रक्रिया के अंदर
- इतनी के रूप में इसके उत्पादन हमारे
STDIN
पर पहुंच बनाने के लिए।
- फिर
exec
बाहरी परिवर्तन इसके प्रदर्शन को करने के लिए।
- स्ट्रिंग-प्रिंटर अपना काम करता है और फिर
exit
, जो अगले स्तर तक जाता है।
- मुख्य कार्यक्रम में वापस, परिवर्तित परिणाम पढ़ें।
उस सभी सेट अप के साथ, आपको बस इतना करना है कि नीचे दिए गए सुझाव, श्री कोब।
#! /usr/bin/env perl
use 5.10.0; # for defined-or and given/when
use strict;
use warnings;
my @transform = qw(tr [A-Za-z] [N-ZA-Mn-za-m]); # rot13
my @inception = (
"V xabj, Qnq. Lbh jrer qvfnccbvagrq gung V pbhyqa'g or lbh.",
"V jnf qvfnccbvagrq gung lbh gevrq.",
);
sub snow_fortress { print map "$_\n", @inception }
sub hotel {
given (open STDIN, "-|" // die "$0: fork: $!") { #/StackOverflow hiliter
snow_fortress when 0;
exec @transform or die "$0: exec: $!";
}
}
given (open my $fh, "-|" // die "$0: fork: $!") {
hotel when 0;
print while <$fh>;
close $fh or warn "$0: close: $!";
}
इस तरह के एक मजेदार कार्यक्रम लिखने का अवसर के लिए धन्यवाद!
देखें 'perlipc' मैनुअल पृष्ठ एक चर्चा और विभिन्न दृष्टिकोणों के उदाहरण के बहुत सारे है। – tripleee