Sto scrivendo un programma che esegue un processo secondario esterno in modo interattivo e ho bisogno del contenuto dell'handle di output per essere inviato a stdout non appena è disponibile . Ho provato qualcosa di simile:Haskell: Come convogliare i contenuti di un handle in un altro in tempo reale
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
Ma questo non funziona in quanto riconosce solo linea di uscita per linea, in modo che qualsiasi uscita sul manico uscita processi che non termina con un ritorno a capo non si presenta . Ho provato la stessa cosa con hGetContents ma produce lo stesso risultato. Ho letto la documentazione di System.Process e System.IO e non ho trovato nulla di conclusivo.
Grazie, non ho nemmeno pensato di cambiare la modalità di buffering su stdin/stdout. – drt
Vale la pena notare che l'impostazione predefinita su Windows è diversa da quella predefinita su Linux, quindi vale comunque la pena impostare il tipo di buffer per ottenere un comportamento coerente. – porges