मेरे पास एक पर्ल स्क्रिप्ट है जो फ़ाइलों की सूची के बारे में जानकारी एकत्र करने के लिए बाहरी उपकरण (क्लीयरूल) का उपयोग करती है। मैं आईपीसी उपयोग करने के लिए प्रत्येक फ़ाइल के लिए एक नई प्रक्रिया को उत्पन्न करने से बचना चाहते हैं:मैं विंडोज पर एक गैर-अवरुद्ध आईपीसी कैसे पढ़ूं?
use IPC::Open2;
my ($cin, $cout);
my $child = open2($cout, $cin, 'cleartool');
आदेश है कि वापस जाने के एकल लाइनों में अच्छी तरह से काम करते हैं। जैसे
print $cin "describe -short $file\n";
my $description = <$cout>;
आदेश है कि कई पंक्तियों लौटने मुझे कैसे एक अवरुद्ध द्वारा काट दिया हो रही बिना पूरे प्रतिक्रिया का उपभोग करने के लिए एक मरे हुए अंत में है पढ़ें:
print $cin "lshistory $file\n";
# read and process $cout...
मैं के लिए filehandle स्थापित करने के लिए कोशिश की है गैर अवरुद्ध fcntl
के माध्यम से पढ़ता है:
use Fcntl;
my $flags = '';
fcntl($cout, F_GETFL, $flags);
$flags |= O_NONBLOCK;
fcntl($cout, F_SETFL, $flags);
लेकिन Fcntl संदेश के साथ मर जाता है "आपका विक्रेता निर्धारित नहीं किया Fcntl मैक्रो F_GETFL।"
मैंने $cout->blocking(0)
सेट करने के लिए IO :: हैंडल का उपयोग करने का प्रयास किया है, लेकिन यह विफल रहता है (यह undef
देता है और $!
को "अज्ञात त्रुटि" पर सेट करता है)।
मैं डेटा उपलब्ध हो, तो पढ़ने के लिए प्रयास करने से पहले select
उपयोग करने के लिए निर्धारित करने के लिए कोशिश की है:
my $rfd = '';
vec($rfd, fileno($cout), 1) = 1;
while (select($rfd, undef, undef, 0) >= 0) {
my $n = read($cout, $buffer, 1024);
print "Read $n bytes\n";
# do something with $buffer...
}
लेकिन यह है कि कभी भी कुछ भी पढ़ने के बिना लटकी हुई है। क्या कोई जानता है कि यह काम कैसे करें (विंडोज़ पर)?
आईओ पर अवरुद्ध न होने पर आप क्या करने की योजना बना रहे हैं? – jrockway
मैं तब तक पढ़ना चाहता हूं जब तक कि मैं डेटा प्राप्त करना बंद नहीं कर पाता, जो यह निर्धारित करने के प्रयास से अधिक विश्वसनीय प्रतीत होता है कि मैं डेटा को पार्स करके अंत तक पहुंच गया हूं जिसे मैंने पहले ही पुनर्प्राप्त कर लिया है। (डेटा में यह "आखिरी पंक्ति" संकेत नहीं है।) –
किसी संबंधित समस्या के लिए चारों ओर खोजना, मुझे गिटहब पर यह प्रतिबद्धता मिली, जो एक गैर-अवरुद्ध सॉकेट बनाने के लिए काले जादू का आह्वान करता है: https: // github .com/kthakore/frozen-bubble/commit/735dd2307455e32c69827e013992c2d022cb7347 –