Ich schreibe ein Programm, das einen externen Subprozess interaktiv ausführt, und ich muss den Inhalt des Ausgabe-Handles nach stdout ausgeben, sobald er verfügbar ist. Ich habe etwas Ähnliches versucht:
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
Aber das funktioniert nicht, da es die Ausgabe nur zeilenweise erkennt, so dass jede Ausgabe auf dem Ausgabe-Handle des Prozesses, die nicht durch einen Zeilenumbruch beendet wird, nicht angezeigt wird. Ich habe dasselbe mit hGetContents versucht, aber das Ergebnis ist dasselbe. Ich habe die Dokumentation sowohl von System.Process als auch von System.IO durchgelesen und nicht wirklich etwas Schlüssiges gefunden.