开发者

Perl pipe and C process as child [Windows ]

I want to fork a child ( which is my C executable ) and share a pipe between perl and C process, Is it possi开发者_JAVA技巧ble to have STDOUT and STDIN to use as pipe.

Tried with following code but child process keep continue running.

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 "$_";
}


The Safe Pipe Opens section of the perlipc documentation describes a nice feature for doing this:

The open function will accept a file argument of either "-|" or "|-" to do a very interesting thing: it forks a child connected to the filehandle you've opened. The child is running the same program as the parent. This is useful for safely opening a file when running under an assumed UID or GID, for example. If you open a pipe to minus, you can write to the filehandle you opened and your kid will find it in his STDIN. If you open a pipe from minus, you can read from the filehandle you opened whatever your kid writes to his STDOUT.

But according to the perlport documentation

open

open to |- and -| are unsupported. (Win32, RISC OS)


EDIT: This might only work for Linux. I have not tried it for Windows. There might be a way to emulate it in Windows though.

Here is what you want I think:

#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
}

Now you can communicate to the shell via FROM_C and TO_C as input and output, respectively.


This Q&A over on Perlmonks suggests that open2 runs fine on Windows, provided you manage it carefully enough.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜