我如何在Haskell中保持一个已产生的进程?

时间:2018-11-10 13:43:48

标签: haskell asynchronous haskell-stack

我正在尝试在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 :(得分:1)

在文档中,看来stopProcess迫使进程停止(它在unix上发送SIGTERM)。这是因为文档声明其调用terminateProcess,然后等待。

我们只想等待而不终止该过程。我会尝试使用waitExitCode或类似的功能。