Windows was not designed with forking in mind. I get the same problem using backticks - they work fine in the parent but hang in the child. Probably relates to the fork() implementation/emulation on Windows. Solution - don't use backtics in child. This works fine using the Net::Ping module.
use Net::Ping;
pipe (FROM_CHILD, TO_PARENT) or die "Oops Pipe: $!\n";
pipe (FROM_PARENT, TO_CHILD) or die "Oops Pipe: $!\n";
select((select(TO_CHILD), $|++ )[0]); # set autoflush
select((select(TO_PARENT), $|++ )[0]); # set autoflush
$|++;
my $result;
# let's fork
if ( my $pid = fork ) {
# this is parent
print "Sending to kid\n";
sleep 1;
print TO_CHILD "perlmonks.org\n";
chomp( my $child_says = <FROM_CHILD> );
print "Child says '$child_says' to parent\n";
$result = $child_says;
waitpid( $pid, 0 );
} else {
# this is child
die "Can't fork: $!\n" unless defined $pid;
print "Waiting to get info from parent\n";
chomp( my $parent_says = <FROM_PARENT> );
print "Parent says '$parent_says' to child\n";
my $p = Net::Ping->new();
my $ping = $p->ping($parent_says);
print "Net::Ping in child returned: $ping\n";
$p->close();
print TO_PARENT "Child pid $$ replies:$ping\n";
exit;
}
close FROM_CHILD; close TO_CHILD;
close FROM_PARENT; close TO_PARENT;
print "Parent got $result\n";
cheers
tachyon
s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print
|