2

open我在 perl中见过这两种形式的管道。

一种是简单的管道打开

open FH,'| command';

其他是安全管道打开

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

现在,-第二个有什么用?他们都写到管道。我知道这会-分叉新进程。

简单|也会创建新流程吗?

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

4

2 回答 2

3

之间没有区别

 open my $PIPE, '| command';

对比

 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);

但是没有外壳(因此浪费的资源更少,您将获得程序的PID而不是外壳的PID,并且您会知道程序是否因信号而死)。

不幸的是,没有像 for 那样零参数的程序的语法system

(也open my $PIPE, "|-"没有更多的参数,但那是另一回事。)

于 2013-03-09T08:09:18.510 回答
1

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

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