2016-07-28 42 views
0
sub do_something { 
    while(1) { 
     #see if $brcmd has finished here 
     # if ($BR finished) ? 
     sleep 1; 


    } 
} 

open $BR, q{-|}, $brcmd 
    or die 'Cannot open BR'; 

do_something(); 

my $err = !(close $BR) 
在上面的代碼

,我打開$brcmd這確實裏面do_something()東西長 ,我希望能夠檢查是否$brcmd已完成的Perl:通過開放的執行命令,看看命令完成

有什麼建議嗎?

+0

'waitpid'是你的朋友。 – Sobrique

+0

@Sobrique waitpid裏面(1)看看$ brcmd是否已完成? – ealeon

+0

@是否需要$ brcmd的pid?你會怎麼做到的? – ealeon

回答

2

它只是東西做了很長的時間(我曾經從它讀的東西,但不再需要)。我只是想能夠知道它是否完成。

我需要做的完全是別的東西,而這是運行,但是當完成時我需要退出。所以我需要能夠進行輪詢,如果它沒有捕獲任何它。

如果這些是你的要求,你應該救孩子的PID(的open的返回值),然後,當父完成後,waitpid的孩子。

perldoc -f open實際上有這樣一個例子:

my $child_pid = open(my $from_kid, "-|") // die "Can't fork: $!"; 

# ... 

if ($child_pid) { 
    # am the parent: 
    # either write $to_kid or else read $from_kid 
    ... 
    waitpid $child_pid, 0; 
} else { 
    # am the child; use STDIN/STDOUT normally 
    ... 
    exit; 
} 

當然,如果你真的不需要讀取來自外部命令什麼,你可以fork然後使用exec執行外部命令。

+0

是的,nonblocking waitpid是我在找什麼。謝謝 – ealeon

0

你不給什麼$brcmd可能是任何暗示,但既然你已經被它打開一個管道,我建議你從這個管道讀取和等待文件結束

這樣的事情,也許?

open my $br_fh, '-|', $brcmd or die "Cannot open BR command: $!"; 

my @output = <$br_fh>; 
+0

是的,它只是一個很長一段時間(我曾經閱讀的東西,但不再需要)。我只是想能夠知道它是否完成。 – ealeon

+0

我需要完全做別的事情,但是當完成時我需要退出。所以我需要能夠調查,如果它沒有捕獲任何它從它 – ealeon