# Popen, open3 problems

**URL:** <https://www.ruby-forum.com/t/popen-open3-problems/76256>\
**Category:** Ruby\
**Created:** [November 17, 2006, 12:30am UTC](https://www.ruby-forum.com/t/popen-open3-problems/76256 "2006-11-17T00:30:29Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![splattael](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@splattael](https://www.ruby-forum.com/u/splattael)\
**Post date:** [November 17, 2006, 12:30am UTC](https://www.ruby-forum.com/t/popen-open3-problems/76256/1 "2006-11-17T00:30:29Z")

</div>

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 = ) { #first line is the command  
chomp($line);  
if ($line eq “set\_var”) { &set\_var;}  
elsif ($line eq “quit”) { exit 0;}  
}

sub set\_var {  
$var=; #second…lines are the params; get the var  
chomp($var);  
print “set.”; #return a confirmation  
}

---

<div class="post-metadata">

**Author:** ![splattael](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@splattael](https://www.ruby-forum.com/u/splattael)\
**Post date:** [November 17, 2006, 12:54am UTC](https://www.ruby-forum.com/t/popen-open3-problems/76256/2 "2006-11-17T00:54:35Z")

</div>

On Fri, 17 Nov 2006, Peter S. wrote:

> something about IPC?  
> man stdio  
> /buffer

> My curent progs look like this:
> 
> require ‘fcntl’  
> require ‘open3’

```
 harp:~ > cat a.rb
 require 'open3'

 Open3.popen3 "perl a.pl" do |i,o,e|
   i.puts 'set_var'
   i.puts 'v=8'
   i.flush # <<---

   puts o.gets
 end

 harp:~ > cat a.pl

 $| = 1; # <<---

 while ($line = <STDIN>) {
   chomp($line);
   if ($line eq "set_var") { &set_var;}
   elsif ($line eq "quit") { exit 0;}
 }

 sub set_var { $var=<STDIN>; chomp($var); print "set.$var\n"; }

 harp:~ > ruby a.rb
 set.v=8

```

-a

---

<div class="post-metadata">

**Author:** ![splattael](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@splattael](https://www.ruby-forum.com/u/splattael)\
**Post date:** [November 17, 2006, 12:56am UTC](https://www.ruby-forum.com/t/popen-open3-problems/76256/3 "2006-11-17T00:56:36Z")

</div>

Peter S. wrote:

/ …

> pin.syswrite “set\_var\n”  
> pin.syswrite “v=8\n”  
> #pin.close\_write #\<----------don’t want to do this but have to!

Have you tried “pin.flush” ?

---

<div class="post-metadata">

**Author:** ![splattael](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@splattael](https://www.ruby-forum.com/u/splattael)\
**Post date:** [November 17, 2006, 9:01am UTC](https://www.ruby-forum.com/t/popen-open3-problems/76256/4 "2006-11-17T09:01:21Z")

</div>

removed\_email\_address@domain.invalid wrote:  
…

> ```
> i.puts 'v=8'
> i.flush # <<---
> 
> ```

ok. i don’t need this if I use syswrite (flush flushes only ruby  
buffers)

> ```
> puts o.gets
> end
> 
> harp:~ > cat a.pl
> 
> $| = 1; # <<---
> 
> ```

yes! that’s it. I knew there was some perl-guru-thing about it.

> ```
> set.v=8
> 
> ```

thanks very much.

---

<div class="post-metadata">

**Author:** ![splattael](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@splattael](https://www.ruby-forum.com/u/splattael)\
**Post date:** [November 17, 2006, 9:05am UTC](https://www.ruby-forum.com/t/popen-open3-problems/76256/5 "2006-11-17T09:05:21Z")

</div>

Peter S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 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?

Are you sure it’s that Ruby didn’t send the data, and not that perl  
didn’t answer yet?

I.e., have you tried setting $| on the perl side?  
[http://perl.plover.com/FAQs/Buffering.html](http://perl.plover.com/FAQs/Buffering.html)

I love perl, it’s an awesome language, but unfortunately there are many  
magic nooks and crannies.

lg, Bernd
