Perl管道和C进程作为孩子[Windows]

时间:2010-07-02 18:50:02

标签: perl

我想分叉一个孩子(这是我的C可执行文件)并在perl和C进程之间共享一个管道, 是否可以将STDOUT和STDIN用作管道。

尝试使用以下代码,但子进程继续运行。

use IPC::Open2;
use Symbol;
my $CHILDPROCESS= "chile.exe";
$WRITER = gensym();
$READER = gensym();

my $pid = open2($READER,$WRITER,$CHILDPROCESS);
while(<STDIN>)
{
   print $WRITER $_;
}
close($WRITER);
while(<$READER>)
{
    print STDOUT "$_";
}

3 个答案:

答案 0 :(得分:1)

perlipc文档的Safe Pipe Opens部分描述了一个很好的功能:

  

open函数将接受"-|""|-"的文件参数来做一件非常有趣的事情:它会分叉连接到您打开的文件句柄的子项。孩子正在运行与父母相同的程序。例如,当在假定的UID或GID下运行时,这对于安全地打开文件很有用。如果您打开一个减号管道,您可以写入您打开的文件句柄,您的孩子将在他的STDIN中找到它。如果您从减号打开管道,您可以从您打开的文件句柄中读取您孩子写给STDOUT的任何内容。

但根据perlport documentation

  

     

|-开放,-|不受支持。 (Win32,RISC OS)

答案 1 :(得分:0)

编辑:这可能仅适用于Linux。我没有尝试过Windows。可能有一种方法可以在Windows中模拟它。

以下是我想要的内容:

#Set up pipes to talk to the shell.
pipe(FROM_PERL, TO_C) or die "pipe: $!\n";
pipe(FROM_C, TO_PERL) or die "pipe: $!\n";

#auto flush so we don't have (some) problems with deadlocks.
TO_C->autoflush(1);
TO_PERL->autoflush(1);

if($pid = fork()){
    #parent
    close(FROM_PERL) or die "close: $!\n";
    close(TO_PERL) or die "close: $!\n";
}
else{
    #child
    die "Error on fork.\n" unless defined($pid);

    #redirect I/O
    open STDIN, "<&FROM_PERL";
    open STDOUT, ">&TO_PERL";
    open STDERR, ">&TO_PERL";
    close(TO_C) or die "close: $!\n";
    close(FROM_C) or die "close $!\n";

    exec("./cprogram"); #start program
}

现在,您可以分别通过FROM_C和TO_C作为输入和输出与shell进行通信。

答案 2 :(得分:0)

Perlmonks上的问答表明open2在Windows上正常运行,只要您仔细管理即可。