[Haskell-cafe] I/O system brokenness with named pipes
jgoerzen at complete.org
Fri Apr 11 08:12:59 EDT 2008
On Friday 11 April 2008 05:39:54 am Duncan Coutts wrote:
> On Thu, 2008-04-10 at 20:34 -0500, John Goerzen wrote:
> > I have created the named pipe from Haskell no problem.
> > But I can't use writeFile to write data to it. Worse, it returns:
> > *** Exception: /tmp/bakroller.zD0xHj/fifo: openFile: does not exist
> > (No such device or address)
> > What's going on here? Am I going to have to resort to the
> > System.Posix interface just to be able to write to a named pipe?
> Named pipes have broken semantics for non-blocking IO, see google or the
> man pages on named pipes. GHC's standard Handle IO always sets file
> descriptor to non-blocking mode. That's the problem. That's why cat
> works, because it uses blocking IO.
OK, I have referred to fifo(7) regarding this point. It seems I may need a
loop trying over and over to open the FIFO in write mode. It also appears
that ReadWriteMode appearing to work is Linux-specific, and this behavior is
left undefined in POSIX.
Does openFd do a non-blocking open? (Brief testing suggests it does) I'm
somewhat confused about its semantics, especially since it does not appear
to correspond directly to open(2). O_CREAT, for instance, is missing.
> You would indeed need to use System.Posix to get a FD in blocking mode.
> Then you have to worry a bit about blocking other Haskell thread when
> you block on writing to the pipe.
Fortunately, in this particular case, I'm using forking instead of threading
so this won't be a problem.
Thanks for the help.
More information about the Haskell-Cafe