
On Thu, 9 Feb 2006, Marc Weber Marc Weber wrote: ...
So my simple test looks like this:
module Main where import System.IO import System.Posix.IO
main = do (fdIn,fdOut) <- createPipe let (iohIn, iohOut) = (fdToHandle fdIn, fdToHandle fdOut) hIn <- iohIn hOut <- iohOut hPutStr hIn "test" line <- hGetLine hOut print line -- should now print test having been piped through my pipe
but I get the error: pipe2:
: hPutStr: illegal operation (handle is not open for writing)
That's right. "The first component is the fd to read from, the second is the write end." You're writing to the read end.
And in current CVS docs in base.System.Process.hs it is said that createPipe is no longer exported ?
Maybe they're just going to export functions like this under their common POSIX names ("pipe", "dup2"), and bring them more into line with standard behavior (execve takes argv[0..n], not argv[1..n].) "Slow" devices like pipes, sockets etc. get along fine with Handles or whatever buffered I/O - as long as you have only one going at a time. Multiple input sources - like, say you want to read a process' output (unit 1) and diagnostic output (unit 2) separately, and either one has the potential to fill up the pipe and block while you're waiting for input on the other pipe - buffers at least complicate the dispatching mechanics you need for this, if not make it impossible. For my money, it makes more sense to learn how deal with pipes directly at the file descriptor level, and at worst if the committees find it too unsightly you may have to write FFI interfaces to get pipe() back. Donn Cave, donn@drizzle.com