Volker Wysk <[EMAIL PROTECTED]> writes: > (zu, von) <- createPipe > vonh <- fdToHandle von > hSetBuffering vonh NoBuffering > mpid <- forkProcess > case mpid of > Nothing -> do -- child > -- connect pipe's read end to stdin > -- and close its write end > dupTo zu (intToFd 0) > fdClose zu > hClose vonh > executeFile prog True par Nothing > ... -- (print error message) > Just pid -> do -- parent > fdClose zu -- close pipe's read end > -- ** here ** > hPutStr vonh txt -- write text to forked process > hClose vonh -- close pipe's write end > -- wait for child process to finish > (Just ps) <- getProcessStatus True True pid > if ps == Exited ExitSuccess > then return () > else ...) -- (error message) > > The problem is that the child process doesn't receive all the data which > the parent sends. It's as if "hPutStr vonh txt" sends the data lazily > somehow, and "hClose vonh" closes the pipe prematurely. > > It varies from run to run exactly which data gets through. If I cause the > child process to read all its input immediately, the problem doesn't > seem to occur. Normally, it does so gradually, which takes a few seconds. > > I'm using GHC 5.02.2
Quite possibly could be a bug. Lazy IO is rather subtle I think, specially when done across pipes. I faced some similar problem with in POpen recently. You can see how I solved it (worked round it?) by comparing the latest release 1.00 with the previous one 0.00.1: http://www.01.246.ne.jp/~juhp/haskell/popenhs/ In comparison Posix.runProcess allows attaching file handles to the in, out and error pipes, which can be written to and read from eagerly I suppose. Jens _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell