मुझे एक स्क्रिप्ट पर टाइमआउट करने की आवश्यकता है जो आईओ को अवरुद्ध कर रहा है।
हैरानी की बात यह exit
रुक जाता है पता चला है, अगर वहाँ एक उपप्रक्रिया के लिए एक खुला पाइप है: कोई open
कॉल यह काम करता है के साथपर्ल: सिग्नल हैंडलर में बंद उपप्रोसेस पाइप लटकता है?
#!/usr/bin/perl
(-f "foo") || die "file foo doesn't exist";
open(IN, "tail -f foo |");
$SIG{ALRM} = sub
{
print "trying to exit...\n";
exit 0; # Hangs with above open() call
};
alarm 1;
while (1)
{
sleep 5; # Do stuff ...
}
, दुर्भाग्य से हटाने के लिए यह इस मामले स्क्रिप्ट इसकी आवश्यकता है में एक विकल्प नहीं है।
लगता exit
तरह filehandle बंद करने के लिए कोशिश कर रहा है और यह है कि क्या व्यतीत कर रहा है है: मुझे लगता है कि यह एक संकेत हैंडलर अंदर से बच्चे को उठा के बारे में भी खुश नहीं है
$SIG{ALRM} = sub
{
print "trying to close...\n";
close(IN); # Hangs ...
print "ok\n";
exit 0;
};
...
करता है किसी को इस के आसपास एक अच्छा तरीका पता है?
बेशक आप बिल्कुल सही हैं, मूर्ख मुझे! भ्रमित करने वाला हिस्सा यह था कि प्रारंभिक 'निकास' वास्तव में काम करता है लेकिन केवल इसलिए कि यह दौड़ की स्थिति बनाता है (बच्चा अभी तक तैयार नहीं है)। धन्यवाद ! – lemonsqueeze