P
Peter Schrammel
Hi,
I think this problem is surely solved but hven't found anything on the net:
I get two programs:
1. a ruby (master)
2. a perl (slave)
I want the master to set commands to the slave and wait for the answer
(repeatedly). So a conversation could look like this:
m: set_var
m: v=8
s: set
m: get_var
m: v
s: 8
....
The problem is that ruby refuses to write to stdin of the slave until I
close the pipe. But I want to use the pipe repeatedly. Did I miss
something about IPC?
Thanks
My curent progs look like this:
require 'fcntl'
require 'open3'
pin, pout, perr = Open3.popen3('perl test.pl')
pin.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
pout.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
perr.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
pin.syswrite "set_var\n"
pin.syswrite "v=8\n"
#pin.close_write #<----------don't want to do this but have to!
result=pout.readline
puts result
#pin.close
pout.close
perr.close
---------------------------------------------------------------------------
perl slave:
while ($line = <STDIN>) { #first line is the command
chomp($line);
if ($line eq "set_var") { &set_var;}
elsif ($line eq "quit") { exit 0;}
}
sub set_var {
$var=<STDIN>; #second...lines are the params; get the var
chomp($var);
print "set."; #return a confirmation
}
I think this problem is surely solved but hven't found anything on the net:
I get two programs:
1. a ruby (master)
2. a perl (slave)
I want the master to set commands to the slave and wait for the answer
(repeatedly). So a conversation could look like this:
m: set_var
m: v=8
s: set
m: get_var
m: v
s: 8
....
The problem is that ruby refuses to write to stdin of the slave until I
close the pipe. But I want to use the pipe repeatedly. Did I miss
something about IPC?
Thanks
My curent progs look like this:
require 'fcntl'
require 'open3'
pin, pout, perr = Open3.popen3('perl test.pl')
pin.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
pout.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
perr.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
pin.syswrite "set_var\n"
pin.syswrite "v=8\n"
#pin.close_write #<----------don't want to do this but have to!
result=pout.readline
puts result
#pin.close
pout.close
perr.close
---------------------------------------------------------------------------
perl slave:
while ($line = <STDIN>) { #first line is the command
chomp($line);
if ($line eq "set_var") { &set_var;}
elsif ($line eq "quit") { exit 0;}
}
sub set_var {
$var=<STDIN>; #second...lines are the params; get the var
chomp($var);
print "set."; #return a confirmation
}