# Using pipe, but subprocess didn't flush

**URL:** <https://www.ruby-forum.com/t/using-pipe-but-subprocess-didnt-flush/165896>\
**Category:** Ruby\
**Created:** [April 19, 2009, 9:49am UTC](https://www.ruby-forum.com/t/using-pipe-but-subprocess-didnt-flush/165896 "2009-04-19T09:49:14Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![kim\_jun\_young](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/2bfe46/32.png) [@kim\_jun\_young](https://www.ruby-forum.com/u/kim_jun_young)\
**Post date:** [April 19, 2009, 9:49am UTC](https://www.ruby-forum.com/t/using-pipe-but-subprocess-didnt-flush/165896/1 "2009-04-19T09:49:14Z")

</div>

hi, all,

I wanna to execute subprocess and catch subprocess’ output from a pipe  
in a parent process.

but, unfortunately, a subprocess didn’t flush it’s output in stdout.  
As a result, the parent process cannot recognize what the subprocess  
did.

this is a sample code for my case.

clue 1) when I executed “isql -Usybase -P -SHOME\_SERVER”

the first prompt of it is

1\>

clue 2) in my program, I executed this.  
read = IO.popen(“isql -Usybase -P -SHOME\_SERVER”, “r”)

puts read.sysread(2)

read.close

also it printout “1\>”

clue 3) different case of clue 2  
read = IO.popen(“isql -Usybase -P -SHOME\_SERVER”, “r+”) # read-write  
mode

puts read.sysread(2)

read.close

it doesn’t print out anything.

clue 4) different case of clue 2  
require “open3”  
include Open3

stdin, stdout, stderr = popen3(“isql -Usybase -P -SHOME\_SERVER”)

puts stdout.sysread(1) \<-- wait forever.

could you suggest me solution?

---

<div class="post-metadata">

**Author:** ![kim\_jun\_young](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/2bfe46/32.png) [@kim\_jun\_young](https://www.ruby-forum.com/u/kim_jun_young)\
**Post date:** [April 19, 2009, 6:20pm UTC](https://www.ruby-forum.com/t/using-pipe-but-subprocess-didnt-flush/165896/2 "2009-04-19T18:20:30Z")

</div>

On 19.04.2009 09:48, kim jun young wrote:

> clue 1) when I executed “isql -Usybase -P -SHOME\_SERVER”
> 
> the first prompt of it is
> 
> 1\>
> 
> clue 2) in my program, I executed this.  
> read = IO.popen(“isql -Usybase -P -SHOME\_SERVER”, “r”)
> 
> puts read.sysread(2)

Why are you using #sysread?

> read.close
> 
> also it printout “1\>”

This is most likely because stdin of the child is closed which makes  
“isql” terminate and hence flush its IO buffers.

> clue 4) different case of clue 2  
> require “open3”  
> include Open3
> 
> stdin, stdout, stderr = popen3(“isql -Usybase -P -SHOME\_SERVER”)
> 
> puts stdout.sysread(1) \<-- wait forever.
> 
> could you suggest me solution?

You have no control over how the child process does its IO. If it  
chooses to do IO buffering you cannot switch if off externally unless  
the program provides a mechanism to do so.

I believe there is a library for setting up pseudo terminals in Ruby  
programs which might work if “isql” uses that information to decide  
whether to sync IO or not. If that does not work, you’re probably out  
of luck.

IMHO you better try to access MS SQL Server or Sybase (whichever you  
use) via DBD / DBI if possible at all.

Kind regards

robert
