Как мне сохранить порожденный процесс в Хаскеле? - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь установить «мост» между моим кодом на Haskell и интерактивным процессом командной строки.Точнее говоря, я пытаюсь запустить Elm REPL и отправить / получить через stdin / stdout.Я не был уверен, какую именно библиотеку использовать для этого, но я выбрал typed-process.

Проблема, с которой я столкнулся, заключается в том, что моя программа на Haskell заканчивается (или завершается)пока процесс REPL все еще работает.Как мне избежать этого?

Кроме того, другая проблема заключается в том, что процесс REPL не получает никакого ввода от дескриптора stdin.

Мой текущий код выглядит следующим образом:

run :: Document -> IO (Result () Text)
run (Document moduleName tests) =  do
    let config = createConfig

    p <- startProcess config

    hSetBuffering (getStdin p) NoBuffering
    hSetBuffering (getStdout p) NoBuffering

    Data.Text.IO.hPutStr (getStdin p) "True\n"
    Data.Text.IO.hGetChunk (getStdout p) >>= print

    _ <- waitExitCode p

    return (Ok ())


{-| Config for process.
-}
createConfig =
    shell "elm repl"
        |> setStdin createPipe
        |> setStdout createPipe
        |> setStderr closed

1 Ответ

0 голосов
/ 10 ноября 2018

Из документов кажется, что stopProcess принудительно останавливает процесс (отправляет SIGTERM в unix). Это потому, что документы заявляют, что он вызывает terminateProcess, а затем ждет.

Мы только хотим подождать, не прерывая процесс. Вместо этого я бы попробовал waitExitCode или аналогичные функции.

...