Haskell : 한 손잡이의 내용물을 실시간으로 파이프하는 방법

StackOverflow https://stackoverflow.com/questions/671610

  •  21-08-2019
  •  | 
  •  

문제

외부 하위 프로세스를 대화식으로 실행하는 프로그램을 작성하고 있으며 출력 핸들의 내용을 사용할 수있게 되 자마자 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

그러나 이것은 출력이 라인별로 만 인식되므로 작동하지 않으므로 Newline으로 종료되지 않은 프로세스 출력 핸들의 출력은 나타나지 않습니다. 나는 hgetContents와 같은 것을 시도했지만 동일한 결과를 얻습니다. System.Process 및 System.io의 문서를 읽었으며 실제로 결정적인 것을 찾지 못했습니다.

도움이 되었습니까?

해결책

hSetBuffering 당신이 찾고있는 것입니다. 기본값 (적어도 Unix에서)은 라인 버퍼링입니다. 기본 루프를 시작하기 전에 Stdin에서 사용하십시오.

hSetBuffering hIn NoBuffering

출력 측면에서 즉시 결과를 보려면 출력 핸들에도 선택적으로. 그러나 버퍼링을 비활성화하면 성능이 상당히 크게 줄어들 수 있습니다.

다른 팁

저는 Haskell Nevbie이지만 최근에 입력 문자별로 처리의 예를 들어온 것을 기억합니다. ~이다 hsetbuffering 아마도 당신이 찾고있는 것을?

버퍼링은 한 가지이지만 사용 중입니다. gGetLine 전체 줄 (또는 파일 끝)을 기다립니다. 사용을 고려하십시오 hGetChar 당시에 한 캐릭터를 읽고 싶다면. 그리고 BTW, 버퍼링을 극복하는 또 다른 방법은 사용하는 것입니다. hFlush.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top