我想分叉一个孩子(这是我的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 "$_";
}
答案 0 :(得分:1)
perlipc文档的Safe Pipe Opens部分描述了一个很好的功能:
open
函数将接受"-|"
或"|-"
的文件参数来做一件非常有趣的事情:它会分叉连接到您打开的文件句柄的子项。孩子正在运行与父母相同的程序。例如,当在假定的UID或GID下运行时,这对于安全地打开文件很有用。如果您打开一个减号管道,您可以写入您打开的文件句柄,您的孩子将在他的STDIN
中找到它。如果您从减号打开管道,您可以从您打开的文件句柄中读取您孩子写给STDOUT
的任何内容。
开
向
|-
开放,-|
不受支持。 (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上正常运行,只要您仔细管理即可。