में खुली वैश्विक फ़ाइल हैंडल कैसे खोजें I मैंने अभी एक समस्या को ट्रैक किया है जहां मुझे जारी रखने के लिए मेरे अपाचे सीजीआई स्क्रिप्ट के लिए सभी खुले फ़ाइल हैंडल बंद करना था। मैंने पार्स :: रिकडेसेंट को समस्या का पता लगाया।एक पर्ल प्रोग्राम
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
$|++;
print "Content-Type: text/plain\n\n";
use Parse::RecDescent;
say "$$: pre-fork: ". time;
if(my $pid = fork) {
# parent
say "$$: return immediately: ". time;
}
else {
# child
say "$$: kicked off big process: ". time;
close STDIN;
close STDOUT;
close STDERR;
# close *{'Parse::RecDescent::ERROR'};
sleep 5;
}
मेरा प्रश्न है कि मैं सभी खुले पैकेज फ़ाइल हैंडल कैसे ढूंढूं?
मुझे पता है fileno
एक खुले फ़ाइलहेडल के लिए काउंटर वापस करेगा। क्या इनके लिए रिवर्स लुकअप करने का कोई तरीका है, या उनके fileno
काउंटर द्वारा फ़ाइलहेडल बंद करें?
मुझे इसकी सादगी पसंद है। – CoffeeMonster
@ikegami: क्लोज-ऑन-फ़ेक ध्वज के बारे में: पर्ल की 'ओपन()' यह निर्धारित करने के लिए '$^F' के मान का उपयोग करेगी कि क्या नई खुली फ़ाइलों में क्लोज-ऑन-फ़ोर फ़्लैग सेट होगा या नहीं। '$^एफ' stdin, stdout, stderr" cutoff "मान का प्रतिनिधित्व करता है - '$^F' से ऊपर फ़ाइल डिस्क्रिप्टर' ओपन()' _ के समय पर क्लोज-ऑन-निष्पादन बिट सेट _at प्राप्त करता है। ('Exec()' time नहीं।) चूंकि stdin, stdout, और stderr स्क्रिप्ट के _before_ निष्पादन को खोला जाता है, इसलिए 'exec ^) के दौरान बंद होने पर' $^F' प्रभावित नहीं होगा। (संयोग से, मैंने इसका अर्थ यह है कि केवल 'STDIN', 'STDOUT', और' STDERR' को डिफ़ॉल्ट रूप से $^F = 2' के रूप में बंद करना आवश्यक है।) – sarnold
@ कर्नाल्ड, $^F के बारे में बताने के लिए बहुत बढ़िया है। मैं बस इतना लापता था। आपको लगता है कि मैं इसके बारे में अधिक जानूंगा क्योंकि मैंने आईपीसी :: ओपन 3 में कोड लिखा था जो एक हैंडल पर क्लोज-ऑन-फ़ंक्शन सेट करता है! – ikegami