簡體   English   中英

IPC :: Open3並確定孩子是否在等待輸入

[英]IPC::Open3 and determining if child is waiting for input

sub run_command
{
    my $COMMAND         = shift;
    my @OUTPUT;
    my %CMD             = {};

    $CMD{pid}           = open3(my $CH_IN, my $CH_OUT, my $CH_ERR, $COMMAND);
    $CMD{_STDIN}        = $CH_IN;
    $CMD{_STDOUT}       = $CH_OUT;
    $CMD{_STDERR}       = $CH_ERR;

    my $line            = readline $CMD{_STDOUT};
    print $line;

#    open my $CMDPROC, q{-|}, $COMMAND   or return;
#    foreach (<$CMDPROC>)
#    {
#        push @OUTPUT, "$ARG";
#    }
    close $CMDPROC                      or return;

    return @OUTPUT
}

上面的代碼是我正在編寫的腳本的一部分,需要運行另一個腳本(稱為child)。 根據/ var / tmp中是否存在cookie文件(兩個腳本都寫在CentOS5 / perl 5.8.8上),孩子可能會也可能不會提示輸入

我需要確定孩子是否以及何時等待輸入,以便父母可以從父母的STDIN傳遞輸入。 我還需要使用open3打開子進程,因為我需要父進程傳遞Perl :: Critic的殘酷(嚴重性1)檢查。

我包含了評論,因為當cookie文件已經設置好后,我至少可以讓父母正確地調用孩子,因為孩子在這種情況下不等待輸入。

我已經檢查過,試圖找到如何確定孩子是否在等待輸入的例子。 我發現的一個例子使用了strace( http://www.perlmonks.org/?node_id=964971 ),我覺得這可能對我想做的事情來說太復雜了。

任何指導我的鏈接將不勝感激。

您可以檢查管道中是否有空間(使用select )。 您甚至可以檢查管道中有多少可用空間。 但是,我從來沒有聽說過檢查線程是否被阻塞等待從管道讀取的能力。 我認為你應該探索其他途徑。


在我看來,只有在滿足與參數無關的某些條件時才從STDIN讀取的程序將提供一個提示,指示它正在等待輸入。 如果是這種情況,可以使用Expect來啟動和控制子程序。

但最簡單的解決方案是無條件地將數據寫入STDIN。 使用IPC :: Open3實現這一點非常復雜[1] ,因此我建議切換到IPC :: Run3 (更簡單)或IPC :: Run (更靈活)。

# Capture's child's STDERR
run3 [ $prog, @args ], \$text_for_stdin, \my $text_from_stdout, \my $text_from_stderr;

要么

# Inherits parent's STDERR
run3 [ $prog, @args ], \$text_for_stdin, \my $text_from_stdout;

  1. 當你同時寫入孩子的STDIN並從孩子的STDOUT讀取時,你需要使用select (或其他東西)來避免死鎖。 IPC :: Open3是非常低級別的,並不適合你,而處理這個是IPC :: Run3和IPC :: Run raison d'être。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM