[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ruby-talk
Subject:    Re: reading from fifo with no writers blocks the whole process
From:       Robert Klemme <shortcutter () googlemail ! com>
Date:       2009-04-30 17:40:04
Message-ID: 75u5r1F19if9hU1 () mid ! individual ! net
[Download RAW message or body]

On 30.04.2009 11:42, Tomasz Wrobel wrote:
> in my program I'm creating a thread, in which I open a FIFO and read
> data from it.
> 
> pipe_listener_thread = Thread.new(ARGV[0]) do |fifoname|
>   while true   # loop to reopen fifo, when it ends because of no writers
>     fi = File.open(fifoname, "r")
>     while line = fi.gets
>       puts "msg: #{line}"
>     end
>     fi.close
>   end
> end
> 
> Everything works fine, except that when the thread is waiting to open
> the fifo, whole process - all threads seem to be blocked. Such thing
> doesn't happen when waiting for data (inner loop) - where the thread
> alone gets blocked.

First of all you should change your code to use the block form of 
File.open.  This avoids keeping the file descriptor open in case of errors.

You can do even more, see 
http://blog.rubybestpractices.com/posts/rklemme/001-Using_blocks_for_Robustness.html

> Please tell, if there's something wrong with this behavior, or it should
> work that way.

I believe this is perfectly ok.  Since IO indicates eof if there is no 
more data in the fifo, it makes sense to block on open as long as there 
is nothing to read.  Otherwise your program would mindlessly be looping 
and burning CPU.

I do wonder though why reading from a named fifo ever reaches eof.  You 
would expect the reading to continue.  OTOH that way you will be aware 
if a program terminates which writes to the fifo and can react on it 
appropriately.

Kind regards

	robert

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic