Haskell中的交互式进程通信

时间:2014-03-22 16:25:28

标签: haskell ipc

我正在尝试编写一个Haskell程序,该程序执行交互式程序(也用Haskell编写),发送和接收文本行。交互式程序从stdIn读取并使用标准Haskell库写入stdOut。

然而,这被证明比我预期的更复杂,可能是由于Haskell懒惰或其他一些神秘的事情发生在背景上。该程序显然陷入僵局,并且没有收到预期会收到的文本行。如果交互式程序由于发送文本行而终止,它确实接收文本,但我需要程序继续运行并接收更多数据(由于某种原因,它被称为交互式)。有时它只在我杀​​死接收消息的程序后打印预期的输出。代码如下所示:

main = do
    (hin,hout,herr,pl) <- (runInteractiveCommand "./PlayerMain")
    hSetBinaryMode hin False
    hSetBinaryMode hout False
    hSetBuffering hin LineBuffering
    hSetBuffering hout NoBuffering
    hPutStr hin "start\n"
    out <- hGetLine hout
    putStrLn out

我已经尝试用严格的Data.Text替换延迟字符串,但行为是相同的。有光吗?

1 个答案:

答案 0 :(得分:5)

可能原因是./PlayerMain的输出正在被缓冲。 ./PlayerMain写出一些不会立即刷新的东西,然后挂起,因为它一直期待更多的输入。

这可以解释为什么在程序终止时获取消息。

因此,如果您修改./PlayerMain并将其stdout设置为NoBuffering,则可能会有效。