5

外部サブプロセスを対話的に実行するプログラムを作成していますが、出力ハンドルの内容が利用可能になり次第 stdout に出力されるようにする必要があります。私はこのようなことを試しました:

main = do processInfo <- createProcess (proc "ghci" []){std_out = CreatePipe,
                                                    std_in  = CreatePipe }
       case processInfo of
          (Just hIn, Just hOut, _, _) -> do mainloop hIn hOut
                                          hClose hIn
                                          hClose hOut
       _                              -> do error "Unable to start process"

mainloop :: Handle -> Handle -> IO ()
mainloop inh outh = 
    do ineof <- hIsEOF outh
       if ineof
          then return ()
          else do inpStr <- hGetLine outh
                  putStrLn inpStr
                  mainloop inh outh

しかし、これは出力を行ごとにしか認識しないため機能しません。そのため、改行で終了していないプロセス出力ハンドルの出力は表示されません。hGetContents で同じことを試しましたが、同じ結果が得られます。System.Process と System.IO の両方のドキュメントを読みましたが、決定的なものは何も見つかりませんでした。

4

3 に答える 3