एक पर्ल स्क्रिप्ट में मैं लिख रहा हूं मुझे समस्या है जहां मैं INT
और QUIT
संकेतों को अवरुद्ध करता हूं, बैकटिक्स के भीतर एक प्रक्रिया निष्पादित करता हूं, और फिर अनब्लॉक करता हूं INT
और QUIT
सिग्नल। मैं बच्चे की प्रक्रिया तक पहुंचने और इसे मारने से INT
या QUIT
को रोकना चाहता हूं।पर्ल: ब्लॉकिंग सिग्नल में देरी नहीं होनी चाहिए -> टेस्ट कोड प्रदान किया जाना चाहिए -> टेस्ट कोड प्रदान किया गया
स्क्रिप्ट सफलतापूर्वक कोड में सही बिंदुओं पर सफलतापूर्वक अवरुद्ध और अनब्लॉक करता है, हालांकि, यह सिग्नल को हटा नहीं देता है और अवरुद्ध करने वाले हैंडलर को निष्पादित करता है, जबकि यह ब्लॉकिंग मोड में है, क्योंकि कई संदर्भों में यह कहना चाहिए। मुझे पता है कि यह अनब्लॉकिंग है क्योंकि मैं ब्लॉक से पहले या उसके बाद SIGINT
भेज सकता हूं या कमांड को अनब्लॉक कर सकता हूं और इसका सम्मान किया जाता है।
ओएस: लिनक्स 2.6.30 पर्ल संस्करण: 5.8.8
कोड के टुकड़े:
#!/usr/local/bin/perl
use POSIX qw(:signal_h);
$SIG{'INT'} = 'gracefulExit';
sub gracefulExit { print "Caught Signal = GOOD\n"; exit; }
print "Recieving a SIGINT works here\n";
sleep 5;
my $sigset = POSIX::SigSet->new;
my $blockset = POSIX::SigSet->new(SIGINT);
sigprocmask(SIG_BLOCK, $blockset, $sigset) or die "dying at block...\n";
print "Recieving a SIGINT doesn't work here [GOOD!] and is NOT delayed [WHY!?].\n";
`/bin/sleep 5`;
sigprocmask(SIG_UNBLOCK, $blockset) or die "dying at unblock...\n";
print "Recieving a SIGINT works here again [GOOD!]\n";
sleep 5;
print "Exited without receiving a signal\n";
यह कौन सा ऑपरेटिंग सिस्टम है? – hlovdal
ओएस: लिनक्स 2.6.30 –
"सिस्टम" या qx (उर्फ बैकक्वॉट्स) का उपयोग न करें। उनमें से दोनों संकेतों को इस तरह से स्थापित करते हैं कि सबसे आम उपयोगकर्ता चाहते हैं। इसके बजाय कांटा/निष्पादन का प्रयोग करें, और फिर आप संकेतों को ठीक से नियंत्रित कर सकते हैं। –