Frage

Ich schreibe ein Programm, das einen externen Unterprozess interaktiv läuft und ich brauche den Inhalt des Ausgabehandle ausgegeben zu werden, sobald nach stdout, sobald sie verfügbar ist. Ich habe so etwas wie dies 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 sie nur Ausgang Zeile für Zeile erkennt, so dass jede Ausgabe auf dem Prozeß Ausgabe Griff, der nicht durch eine neue Zeile beendet wird nicht angezeigt. Ich habe die gleiche Sache mit hGetContents versucht, aber es wird das gleiche Ergebnis. Ich habe durch die Dokumentation von sowohl System.Process lesen und System.IO und haben nicht wirklich etwas schlüssig gefunden.

War es hilfreich?

Lösung

hSetBuffering ist das, was Sie suchen, der Standard (auf Unix mindestens) -Leitung Pufferung ist. Verwenden Sie es auf dem stdin, bevor die Hauptschleife beginnend

hSetBuffering hIn NoBuffering

und gegebenenfalls auch auf der Ausgabe Griff, wenn Sie die Ergebnisse sofort auf der Ausgangsseite sehen wollen. Beachten Sie jedoch, dass Pufferung deaktivieren kann ziemlich drastisch die Leistung verringern.

Andere Tipps

Ich bin sehr viel ein Neuling Haskell, aber ich erinnere mich über ein Beispiel kam vor kurzem von der Verarbeitung Eingabezeichen-by-Charakters. Ist hSetBuffering möglicherweise, was Sie suchen?

Buffering ist eine Sache, aber Sie verwenden gGetLine auch die für eine ganze Zeile (oder das Ende der Datei) warten. Betrachten Sie hGetChar verwenden, wenn Sie wirklich ein Zeichen an der Zeit lesen möchten. Und btw, eine andere Art und Weise Pufferung zu überwinden ist hFlush zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top