2016-01-25 5 views
8

मुझे एक स्क्रिप्ट पर टाइमआउट करने की आवश्यकता है जो आईओ को अवरुद्ध कर रहा है।
हैरानी की बात यह 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; 
}; 

...

करता है किसी को इस के आसपास एक अच्छा तरीका पता है?

उत्तर

10

संकेत हैंडलर एक रेड हेरिंग है, close परवाह किए बिना अवरुद्ध कर देगा:

my $subprocess = open my $foo, "tail -f foo |" or die "Can't open process: $!"; 

say "subprocess=$subprocess"; 

kill 'KILL', $subprocess; 

close $foo;  # <--- happy now 
+1

बेशक आप बिल्कुल सही हैं, मूर्ख मुझे! भ्रमित करने वाला हिस्सा यह था कि प्रारंभिक 'निकास' वास्तव में काम करता है लेकिन केवल इसलिए कि यह दौड़ की स्थिति बनाता है (बच्चा अभी तक तैयार नहीं है)। धन्यवाद ! – lemonsqueeze

1

POSIX::_exit() का उपयोग करके मैन पेज पृष्ठ की तरह सीधे इस विशेष मुद्दे के आसपास काम करने लगता है। लेकिन यह ए-बी समस्या की गंध करता है। क्या आप सुनिश्चित हैं कि सादे पाइप की तुलना में उपप्रोसेसेस को संभालने का एक अधिक परिष्कृत तरीका उपयोग करके आपकी असली समस्या बेहतर हल नहीं होती है, उदाहरण के लिए IPC::Run?

+0

:

open my $foo, "tail -f foo |" or die "Can't open process: $!"; close $foo; # <--- will block 

एक तरीका यह तय करने के लिए kill कि बच्चे open के माध्यम से उप प्रक्रिया आईडी कब्जा करने के लिए है और फिर यह भी काम करता है, लेकिन 'पूंछ' प्रक्रिया चल रही है और अनाथ हो जाती है ... – lemonsqueeze

संबंधित मुद्दे