2

私は、これら 2 つの形式のパイプopenを perl で見てきました。

一つは単純なパイプオープン

open FH,'| command';

その他は安全なパイプが開いています

open FH,'|-','command';

さて、-2番目の用途は何ですか?どちらもパイプに書き込みます。私はそれが-新しいプロセスをフォークすることを知っています。

シンプル|も新しいプロセスを作成しますか?

セーフ パイプ オープンをいつ使用するか/使用する必要があります|-か?

4

2 に答える 2

3

間に違いはありません

 open my $PIPE, '| command';

 open my $PIPE, '|-', 'command';

「安全な」オープンは実際には

 open my $PIPE, '|-', 'program', @one_or_more_args;

このバージョンは、プログラムを直接起動することが保証されています。シェルは呼び出されません。また、引数をシェル リテラルに変換する必要がなくなります。言い換えると、

 open my $FH, '|-', 'program', @one_or_more_args;

と類似しています

 use String::ShellQuote qw( shell_quote );
 open my $FH, '|'.shell_quote('program', @one_or_more_args);

ただし、シェルがなければ (リソースの無駄が少なくなり、シェルの代わりにプログラムの PID を取得し、プログラムがシグナルで停止したかどうかを知ることができます)。

残念ながら、 のような引数がゼロのプログラムの構文はありませんsystem

(これopen my $PIPE, "|-"以上の引数はありませんが、それは別のものです。)

于 2013-03-09T08:09:18.510 に答える
1

自分の fork から ( ) または-自分の fork にパイプする (したい) 場合は、 を使用する必要があります。この関数は、親プロセスでは子のプロセス ID を返し、子プロセスでは 0 を返します。例:-||-open

if( open(TO, "|-") ) {
    # Parent process
    print TO $from_parent;
}
else {
    # Child process
    $to_child = <STDIN>;
    exit;
}
于 2013-03-09T08:07:15.377 に答える