Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Using popen with 0,1,2,3,4 streams

Reply
Thread Tools

Using popen with 0,1,2,3,4 streams

 
 
Jan Koprowski
Guest
Posts: n/a
 
      12-02-2007
Hi !

I try to run command system and get streams handlers to 0 (stdin),
1(stdout), 2(stderr), 3(myOwnStdIn1), 4(myOwnStdIn2). I do something
like that in PHP by proc_open and table of pipes, but here I don't
know how I can get handlers to process streams. I know that this code
is bad but I think something like this:

process = popen('command', 'w+');
stdin = process.new(0, "w");
stdout = process.new(1, "r");

etc...

But new is a static method. What i should to do ?
 
Reply With Quote
 
 
 
 
Judson Lester
Guest
Posts: n/a
 
      12-04-2007
Note: parts of this message were removed by the gateway to make it a legal Usenet post.

Jan,

You might look at popen3 in the standard library. I don't think it quite
does what you need (since it returns an array if three pipes: stdin, stdout
and stderr for the subprocess) but the code is short if a little arcane, and
might point you in the right direction to figure this out.

Judson

On Dec 2, 2007 3:10 AM, Jan Koprowski <(E-Mail Removed)> wrote:

> Hi !
>
> I try to run command system and get streams handlers to 0 (stdin),
> 1(stdout), 2(stderr), 3(myOwnStdIn1), 4(myOwnStdIn2). I do something
> like that in PHP by proc_open and table of pipes, but here I don't
> know how I can get handlers to process streams. I know that this code
> is bad but I think something like this:
>
> process = popen('command', 'w+');
> stdin = process.new(0, "w");
> stdout = process.new(1, "r");
>
> etc...
>
> But new is a static method. What i should to do ?
>
>



--
Your subnet is currently 169.254.0.0/16. You are likely to be eaten by a
grue.

 
Reply With Quote
 
 
 
 
Tim Pease
Guest
Posts: n/a
 
      12-04-2007
On Dec 3, 2007 5:32 PM, Judson Lester <(E-Mail Removed)> wrote:
> Jan,
>
> You might look at popen3 in the standard library. I don't think it quite
> does what you need (since it returns an array if three pipes: stdin, stdout
> and stderr for the subprocess) but the code is short if a little arcane, and
> might point you in the right direction to figure this out.
>
> Judson
>
>
> On Dec 2, 2007 3:10 AM, Jan Koprowski <(E-Mail Removed)> wrote:
>
> > Hi !
> >
> > I try to run command system and get streams handlers to 0 (stdin),
> > 1(stdout), 2(stderr), 3(myOwnStdIn1), 4(myOwnStdIn2). I do something
> > like that in PHP by proc_open and table of pipes, but here I don't
> > know how I can get handlers to process streams. I know that this code
> > is bad but I think something like this:
> >
> > process = popen('command', 'w+');
> > stdin = process.new(0, "w");
> > stdout = process.new(1, "r");
> >
> > etc...
> >
> > But new is a static method. What i should to do ?
> >


Also take a look at open4 and systemu. You can find both at the
codeforpeople project on RubyForge. They, too, will offer some good
insight on what you want to do, though neither does precisely what you
need.

<http://rubyforge.org/projects/codeforpeople>

Blessings,
TwP

 
Reply With Quote
 
Jan Koprowski
Guest
Posts: n/a
 
      12-06-2007
On 4 Gru, 17:58, Tim Pease <(E-Mail Removed)> wrote:
> On Dec 3, 2007 5:32 PM, Judson Lester <(E-Mail Removed)> wrote:
>
>
>
> > Jan,

>
> > You might look at popen3 in the standard library. I don't think it quite
> > does what you need (since it returns an array if three pipes: stdin, stdout
> > and stderr for the subprocess) but the code is short if a little arcane, and
> > might point you in the right direction to figure this out.

>
> > Judson

>
> > On Dec 2, 2007 3:10 AM, Jan Koprowski <(E-Mail Removed)> wrote:

>
> > > Hi !

>
> > > I try to run command system and get streams handlers to 0 (stdin),
> > > 1(stdout), 2(stderr), 3(myOwnStdIn1), 4(myOwnStdIn2). I do something
> > > like that in PHP by proc_open and table of pipes, but here I don't
> > > know how I can get handlers to process streams. I know that this code
> > > is bad but I think something like this:

>
> > > process =popen('command', 'w+');
> > > stdin = process.new(0, "w");
> > > stdout = process.new(1, "r");

>
> > > etc...

>
> > > But new is a static method. What i should to do ?

>
> Also take a look at open4 and systemu. You can find both at the
> codeforpeople project on RubyForge. They, too, will offer some good
> insight on what you want to do, though neither does precisely what you
> need.
>
> <http://rubyforge.org/projects/codeforpeople>
>
> Blessings,
> TwP


Thank You for respond. I know that I can use only 3 pipes. But I think
I can look for open4 and try to write something similar. Thanks !

 
Reply With Quote
 
Jan Koprowski
Guest
Posts: n/a
 
      12-06-2007
On 4 Gru, 17:58, Tim Pease <(E-Mail Removed)> wrote:
> On Dec 3, 2007 5:32 PM, Judson Lester <(E-Mail Removed)> wrote:
>
>
>
> > Jan,

>
> > You might look at popen3 in the standard library. I don't think it quite
> > does what you need (since it returns an array if three pipes: stdin, stdout
> > and stderr for the subprocess) but the code is short if a little arcane,and
> > might point you in the right direction to figure this out.

>
> > Judson

>
> > On Dec 2, 2007 3:10 AM, Jan Koprowski <(E-Mail Removed)> wrote:

>
> > > Hi !

>
> > > I try to run command system and get streams handlers to 0 (stdin),
> > > 1(stdout), 2(stderr), 3(myOwnStdIn1), 4(myOwnStdIn2). I do something
> > > like that in PHP by proc_open and table of pipes, but here I don't
> > > know how I can get handlers to process streams. I know that this code
> > > is bad but I think something like this:

>
> > > process =popen('command', 'w+');
> > > stdin = process.new(0, "w");
> > > stdout = process.new(1, "r");

>
> > > etc...

>
> > > But new is a static method. What i should to do ?

>
> Also take a look at open4 and systemu. You can find both at the
> codeforpeople project on RubyForge. They, too, will offer some good
> insight on what you want to do, though neither does precisely what you
> need.
>
> <http://rubyforge.org/projects/codeforpeople>
>
> Blessings,
> TwP


U try to write something like this:

#
# To change this template, choose Tools | Templates
# and open the template in the editor.
require 'fcntl'
require 'timeout'
require 'thread'

class Broker_process3

READ = 0 # Consts to explicite mark read
WRITE = 1 # and write pipes
@stdin
@stdout
@stderr

def initialize

end

def self.run (command, params)
pw, pr, pe, pl, pp = IO.pipe, IO.pipe, IO.pipe, IO.pipe, IO.pipe
pl.last.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
pp.last.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)

pid = fork {
pw.last.close
STDIN.reopen pw.first
pw.first.close

pr.first.close
STDOUT.reopen pr.last
pr.last.close

pe.first.close
STDERR.reopen pe.last
pe.last.close

pl.last.close
pp.last.close

STDOUT.sync = STDERR.sync = true

exec(*command)
}

[pw.first, pr.last, pe.last, pl.first, pp.first].each{|fd|
fd.close}

pl.last.write("login"); // ERROR HERE
pl.last.close
pp.last.write("hasło");
pp.last.close

pw.last.close
out = pr.first.readlines
pr.first.close
pe.first.close
puts out;
end
end

but in // ERROR HERE I get:

./broker_process3.rb:48:in `write': Broken pipe (Errno::EPIPE)
from ./broker_process3.rb:48:in `run'
from /home/johny/NetBeansProjects/zhradmin/lib/main.rb:12
 
Reply With Quote
 
Jan Koprowski
Guest
Posts: n/a
 
      12-06-2007
On 4 Gru, 17:58, Tim Pease <(E-Mail Removed)> wrote:
> On Dec 3, 2007 5:32 PM, Judson Lester <(E-Mail Removed)> wrote:
>
>
>
> > Jan,

>
> > You might look at popen3 in the standard library. I don't think it quite
> > does what you need (since it returns an array if three pipes: stdin, stdout
> > and stderr for the subprocess) but the code is short if a little arcane,and
> > might point you in the right direction to figure this out.

>
> > Judson

>
> > On Dec 2, 2007 3:10 AM, Jan Koprowski <(E-Mail Removed)> wrote:

>
> > > Hi !

>
> > > I try to run command system and get streams handlers to 0 (stdin),
> > > 1(stdout), 2(stderr), 3(myOwnStdIn1), 4(myOwnStdIn2). I do something
> > > like that in PHP by proc_open and table of pipes, but here I don't
> > > know how I can get handlers to process streams. I know that this code
> > > is bad but I think something like this:

>
> > > process =popen('command', 'w+');
> > > stdin = process.new(0, "w");
> > > stdout = process.new(1, "r");

>
> > > etc...

>
> > > But new is a static method. What i should to do ?

>
> Also take a look at open4 and systemu. You can find both at the
> codeforpeople project on RubyForge. They, too, will offer some good
> insight on what you want to do, though neither does precisely what you
> need.
>
> <http://rubyforge.org/projects/codeforpeople>
>
> Blessings,
> TwP


U try to write something like this:

#
# To change this template, choose Tools | Templates
# and open the template in the editor.
require 'fcntl'
require 'timeout'
require 'thread'

class Broker_process3

READ = 0 # Consts to explicite mark read
WRITE = 1 # and write pipes
@stdin
@stdout
@stderr

def initialize

end

def self.run (command, params)
pw, pr, pe, pl, pp = IO.pipe, IO.pipe, IO.pipe, IO.pipe, IO.pipe
pl.last.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
pp.last.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)

pid = fork {
pw.last.close
STDIN.reopen pw.first
pw.first.close

pr.first.close
STDOUT.reopen pr.last
pr.last.close

pe.first.close
STDERR.reopen pe.last
pe.last.close

pl.last.close
pp.last.close

STDOUT.sync = STDERR.sync = true

exec(*command)
}

[pw.first, pr.last, pe.last, pl.first, pp.first].each{|fd|
fd.close}

pl.last.write("login"); // ERROR HERE
pl.last.close
pp.last.write("hasło");
pp.last.close

pw.last.close
out = pr.first.readlines
pr.first.close
pe.first.close
puts out;
end
end

but in // ERROR HERE I get:

./broker_process3.rb:48:in `write': Broken pipe (Errno::EPIPE)
from ./broker_process3.rb:48:in `run'
from /home/johny/NetBeansProjects/zhradmin/lib/main.rb:12
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
File.popen/IO.popen hariwise@gmail.com Ruby 1 05-20-2006 08:20 AM
using input streams? Used with <x:transform>? spliffmonkey@iname.com Java 0 07-08-2005 10:26 PM
String to Long Double using Streams ferran C++ 5 09-03-2004 11:49 AM
Using Polymortphism with streams Till Crueger C++ 3 05-11-2004 05:39 AM
Using file streams in DLL Saulius C++ 3 08-17-2003 08:15 PM



Advertisments