
On 2007-08-31, Andrea Rossato
On Fri, Aug 31, 2007 at 12:23:42AM +0000, Aaron Denney wrote:
On 2007-08-30, Andrea Rossato
wrote: Hi,
there's something I don't get about interaction among OS processes and Haskell handles/channels.
This looks like a buffering problem. You might be able to make it work by explicitly setting "line buffering" with hSetBuffering
Thanks for your kind attention, but I don't think it's a matter of buffering (I indeed tried playing with hSetBuffering with no results).
I'd like to convince you otherwise: changing main1 to main = do (i,o,e,p) <- runInteractiveCommand "./main2" hSetBuffering i LineBuffering hSetBuffering o LineBuffering loop (i,o,e,p) loop c@(i,o,e,p) = do s <- getLine hPutStrLn i s hFlush i -- now "i" is closed, right? s' <- hGetLine o putStrLn s' loop c and main2 to import System.IO main = do hSetBuffering stdin LineBuffering hSetBuffering stdout LineBuffering s <- getLine case s of "quit" -> putStrLn "quitting" >> return () _ -> loop s where loop s = do putStrLn s main seems to work for me. If you want "expect" like functionality, i.e. working for arbitrary client programs, you'll need to use pseudottys, as expect, script, screen, xterm, etc. do. Unfortunately, the exact details of how to do this vary from unix to unix, and as far as I know, have not been packaged up nicely as a Haskell library. You will have to use the FFI. -- Aaron Denney -><-