2012-07-25 129 views
4

我有以下代码,它从命令'some_command'读取输出。 'some_command'是一个持续的过程,它保持打印输出直到它被杀死。我想知道如果我关闭文件句柄或最后调用它,它是否也会终止'some_command'进程,或者'some_command'可能会作为孤立进程继续运行。我基本上想要从命令中读取输出,直到找到带有/ Output /的行,然后终止。关闭句柄的Perl终止命令

my $mycommand = 'some_command'; 
open IN, "$mycommand 123456 |" or die("Failed: $!"); 
while(my $line = <IN> && !$stop) { 
    if($line =~ /Output/) { 
     # work is done 
     last; 
     $stop = 1; 
    } 
} 
close IN; 

回答

5

这种类型的手柄将通过关闭管道开始的close,然后等待孩子退出。下一次尝试写入管道时,孩子将从SIGPIPE中死亡。如果你不想等那么久,你可以加快速度并自己终止。

my $pid = open ...; 
while (<IN>) { 
    if (/Output/) { 
     # work is done 
     kill TERM => $pid; 
     last; 
    } 

    print; # Or whatever 
} 

close IN; 

(GOT,因为你不使用它摆脱$stop

+0

在你上面提供的例子,我没有打电话给关闭? – yuen23 2012-07-25 14:51:30

+0

@ user1540909,我不是故意要忽略它。如果你没有明确地关闭它,它将在退出时关闭。尽管...如果你使用一个包变量(而不是词法),Perl中的一个wontfix错误使得它不会为孩子“等待”。 – ikegami 2012-07-25 15:10:55

+0

感谢您的解释! – yuen23 2012-07-25 17:47:40