
Hi all, It's the first time I use the runInteractiveCommand and I was probably bitten by laziness. When I run the following program and send its output to a file using '>' redirection I get the full output of the called process. But if I run it in the console I get only half of the output. As console is slower than disk I assume the called process terminates before all data has been read from it or the main process terminates before data has been written to stdout. I thought using waitForProcess, closing called process output and flushing stdout would solve the problem but it doesn't.
-- Compile with -threaded option module Main where
import Control.Concurrent (forkIO) import System.Environment (getArgs) import System.FilePath (dropExtension, takeFileName) import System.IO (Handle, hClose, hFlush, hGetContents, stdout) import System.Process (runInteractiveCommand, waitForProcess)
main :: IO () main = do (file:_) <- getArgs (_, out, _, pid) <- runInteractiveCommand $ "dumpbin /EXPORTS " ++ file forkIO (createDefFile file out) waitForProcess pid hClose out hFlush stdout
createDefFile :: String -> Handle -> IO () createDefFile file inp = do putStrLn $ "LIBRARY " ++ (dropExtension . takeFileName) file ++ ".dll" putStrLn "EXPORTS" text <- hGetContents inp mapM_ writeExport $ keepExports $ map words $ lines text where keepExports :: [[String]] -> [String] keepExports = map head . filter (not . null) . takeWhile (["Summary"]/=) . drop 1 . dropWhile (["ordinal","name"]/=) writeExport ('_':xs) = putStrLn xs writeExport xs = putStrLn xs
Any idea regarding the cause of this problem? Thanks, Olivier.