
On Fri April 11 2008 7:53:12 am Brandon S. Allbery KF8NH wrote:
On Apr 11, 2008, at 6:33 , Don Stewart wrote:
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)
Hmm, I can get this to work, but only if I have another process waiting on the pipe already:
Yep; that's one of the tricky parts of FIFOs. If you don't have the read side *always* open, it behaves very nonintuitively. (But with the read side always open, you will never receive an EOF.)
This has nothing to do with Haskell; it's just the way FIFOs work.
I wonder if we could document this behavior. I rarely use non-blocking I/O from C, and Haskell hides the fact that it's doing this, so the behavior is non-intuitive. Actually, better yet, I wonder if we could *fix* this behavior. Most programs can take a FIFO as arguments in a standard way, and it seems to me that this violates the principle of least surprise. Unfortunately, since we're talking about open here, we can't use select() or poll(). But I wonder if we couldn't use stat() to determine if something is a named pipe, and if so, enter a loop where we try to open it periodically? -- John