我正在尝试编写一个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替换延迟字符串,但行为是相同的。有光吗?
答案 0 :(得分:5)
可能原因是./PlayerMain
的输出正在被缓冲。 ./PlayerMain
写出一些不会立即刷新的东西,然后挂起,因为它一直期待更多的输入。
这可以解释为什么在程序终止时做获取消息。
因此,如果您修改./PlayerMain
并将其stdout
设置为NoBuffering
,则可能会有效。