2014-03-28 25 views
1

我想掏錢一個cmd像執行的命令,在模具錯誤信息如下想從通過開放在Perl

my $h = IO::Handle->new; 
$self->{-handle} = $h; 

die "IO::Handle->new failed." unless defined $h; 
$self->{-pid} = open $h, $self->{-command} . ' 2>&1 |'; 
$self->fileevent($h, 'readable' => [\&_read_cmd_op, $self]); 

sub _read_cmd_op{ 
    my $h = $self->{-handle}; 
    if (sysread $h, $_, 4096) { 
     my $t = $self->Subwidget('text'); 
     $t->insert('end', $_); 
     $t->yview('end'); 
    } else { 
     $self->{-finish} = 1; 
    } 
} 

現在的問題是,「$ {自我-command}」是調用 另一個Perl腳本,如果死亡我想知道。

請注意,即使cmd死亡,$ self {-pid}仍然存在。

上述代碼位於Perl/TK應用程序中,其中$ self - > { - command} o/p在 文本窗口小部件中捕獲。

不知何故,即使在測試小部件中我也沒有得到死亡消息。 我在標準輸出上看到它。

2個問題

  1. 我怎樣才能在文本插件的CMD OP /錯誤?

  2. 我怎麼知道通過IO :: Handle觸發的命令死了?

回答

1

$self->{-pid}是派生進程的只是PID,而不是一些神奇的對象,它就會消失,如果命令退出。

我無法重現問題沒有得到die()消息。如果上面的代碼段被調用'perl -e "die 123"',那麼文本小部件中會出現「123」(至少在Unix系統上)。

爲了獲得退出代碼,您可以使用類似下面的內容。

} else { 
    $mw->fileevent($h, 'readable', ''); 
    my $pid = waitpid($self->{-pid},0); 
    warn "pid $pid finished"; 
    warn "retcode is " . ($? >> 8); 
    $self->{-finish} = 1; 
} 

fileevent呼叫與空回調停止在這個文件句柄進一步進行選擇。通過waitpid調用,您可以等待子進程的終止。發生這種情況後,退出代碼在$?變量中可用,例如在正常調用system()之後。因此,對於非零退出代碼,您知道該命令以假值死亡或退出。

+0

謝謝斯拉文。我正在向文本小部件發送錯誤消息。我的錯誤,因爲我的CMD有'tee',所以stderr已經過濾了。但我得到了retcode = 0。我會做更多的研究.. – user180630

+0

管道的返回值來自鏈中的最後一個命令。比較'false; echo $?'vs.'false |三通; echo $?' –