管道打开'|'之间的区别和'| - '(安全管道打开)

时间:2013-03-09 07:45:27

标签: linux perl pipe

我在perl中看到过这两种形式的管道open

一个是简单的管道打开

open FH,'| command';

和其他是安全管道打开

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

现在,-在第二个中的用途是什么?他们都写到管道。我知道-要求新流程。

简单|是否也会创建新流程?

我们何时/应该使用安全管道打开|-

2 个答案:

答案 0 :(得分:3)

之间没有区别
 open my $PIPE, '| command';

VS

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

“安全”开放实际上是

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

此版本保证直接启动程序;没有调用shell。它还使您不必将参数转换为shell文字。换句话说,

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

类似于

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

但是没有shell(因此浪费了更少的资源,你得到程序的PID而不是shell,并且你知道程序是否死于信号)。

不幸的是,没有类似于system的零args程序的语法。

(还有open my $PIPE, "|-"没有进一步的args,但那是别的。)

答案 1 :(得分:1)

当你计划(你想)从你自己的叉子(-)或你自己的叉子-|进行管道时,你必须使用|-open函数返回父进程中子进程的ID,子进程中返回0。例如:

if( open(TO, "|-") ) {
    # Parent process
    print TO $from_parent;
}
else {
    # Child process
    $to_child = <STDIN>;
    exit;
}