Reading from a named pipe

Hi all,

I need to read some text from a named pipe in ruby. The writing is done
in another (C++) program and I'd like to have Ruby display what is sent.

I've looked at the IO.pipe function, but there seems to be no way to get
a NAMED pipe. The two programs are running under Windows XP, btw.

Are named pipes even supported in Ruby? How can I read from one? Thanks
for your answers! :slight_smile:

ยทยทยท

--
Posted via http://www.ruby-forum.com/.

Gc3bcnther Gruber wrote:

Hi all,

I need to read some text from a named pipe in ruby. The writing is done
in another (C++) program and I'd like to have Ruby display what is sent.

I've looked at the IO.pipe function, but there seems to be no way to get
a NAMED pipe.

Named pipes are opened and read or written as though they were files
(streams). Just open it by path and name.

The two programs are running under Windows XP, btw.

Are you asking how to create the named pipe? That is an operating system
function, and frankly, I don't know if Windows supports them. The operating
system must support the idea of a named pipe, and if it doesn't, no named
pipe.

Are named pipes even supported in Ruby?

As inputs and outputs, yes. This can be said of any language that opens and
reads/writes streams. But the pipe itself must be supported and created by
the OS.

How can I read from one?

Open it like a file.

ยทยทยท

--
Paul Lutus
http://www.arachnoid.com

Paul Lutus wrote:

How can I read from one?

Open it like a file.

Sounds simple, I'll try that out. Thanks!

ยทยทยท

--
Posted via http://www.ruby-forum.com/\.

Windows also has named pipes, but they behave somewhat differently than Unix named pipes. I only have experience with them in C and Perl programming, but I found that you can't do non-blocking reads on a named pipe under Windows, and you can't open, close and reopen the same named pipe in a program. Basically, to use a named pipe for accepting messages under Windows, you probably need to spawn a separate thread to listen to it.

If you're porting Unix software that uses named pipes to Windows, you might be best off selecting a different IPC mechanism altogether, such as sockets. In our porting efforts, we ended up writing a small library that simulated Unix named pipes under Windows using shared memory.

Tom

ยทยทยท

On Nov 17, 2006, at 6:05 AM, Paul Lutus wrote:

Named pipes are opened and read or written as though they were files
(streams). Just open it by path and name.

The two programs are running under Windows XP, btw.

Are you asking how to create the named pipe? That is an operating system
function, and frankly, I don't know if Windows supports them. The operating
system must support the idea of a named pipe, and if it doesn't, no named
pipe.

it's a bit tough sometimes. the reason is that, by default, a process will
hang when opening a named pipe unless there is a process on the other end.
this is by design and one has to use non-blocking io to avoid it, eg

   f = open 'named.pipe', File::RDWR|File::NONBLOCK

something to be aware of... here's an example of some code which uses named
pipes between a c program and ruby

   http://codeforpeople.com/lib/ruby/acgi/acgi-0.1.0/

regards.

-a

ยทยทยท

On Fri, 17 Nov 2006, [utf-8] Gรผnther Gruber wrote:

Paul Lutus wrote:

How can I read from one?

Open it like a file.

Sounds simple, I'll try that out. Thanks!

--
my religion is very simple. my religion is kindness. -- the dalai lama