As a workaround, I am able to trick the child haskell process into thinking it's running in an interactive terminal by wrapping it with /usr/bin/script:
createProcess (proc "/usr/bin/script" ["-qc","./A","/dev/null"]) { std_out = CreatePipe }
I still think haskell is using screwy defaults for stdout buffering..
On Thursday, July 31, 2014 3:24:47 PM UTC-4, Chris Myzie wrote:
Hello,
I'm trying to write a wrapper process that will be able to read any child process' stdout. The problem I'm running into is that unless I force the child's stdout to LineBuffering, it defaults to BlockBuffering. Is BlockBuffering really the default in this case? I don't want to have to modify all of the child processes that I want to use with this wrapper.
Below is a simple test case. A.hs is the child process, and B.hs is the wrapper. If I run B.hs, I will get no output unless I uncomment the line in A.hs.
Thanks,
Chris
------------------------------ A.hs ---------------------------
import Control.Concurrent
import System.IO
main :: IO ()
main = do
-- hSetBuffering stdout LineBuffering
putStrLn "test" >> threadDelay 1000000 >> main
------------------------------ B.hs ---------------------------
import Control.Monad
import System.IO
import System.Process
main :: IO ()
main = do
(_,Just h,_,_) <- createProcess (proc "./A" []) { std_out = CreatePipe }
hSetBuffering h LineBuffering
forever $ hGetLine h >>= putStrLn