【问题标题】:Haskell createProcess and read from HandleHaskell createProcess 并从 Handle 读取
【发布时间】:2014-01-28 19:40:12
【问题描述】:

当我使用 Haskell createProcess 时,是否需要像在 c 中使用 exec 一样进行 fork?

从我所看到的示例中,对于我所尝试的,我认为我没有这样做,但是如果我从输出句柄中读取,一旦我得到预期的结果,但是如果我尝试读取两次,它甚至不会读取一次.

例如:

beginProcess 与 createProcess 相同,z3 是一个从标准输入读取并写入标准输出的 smt 求解器。

execute :: Process -> String -> IO String
execute (Just std_in, Just std_out,_,_) cmd = do
  hPutStr std_in cmd 
  hFlush std_in
  hGetLine std_out

main :: IO()
main = do 
  proc <- beginProcess "z3" ["-smt2","-in"]
  execute proc "(set-option :print-success true)" >>= print
  execute proc "(set-option :print-success true)" >>= print 

如果我执行一次,我会得到预期的结果,但如果我同时执行两次,则什么都不会发生。 我读错了还是写错了句柄?

感谢您提供的任何帮助。

【问题讨论】:

  • 请出示您的进口商品。特别是beginProcess 是什么?我在 hoogle 或 hayoo 上找不到。
  • process 库非常依赖于系统,因此您应该包括您正在使用的平台。

标签: haskell handle createprocess smt


【解决方案1】:

我有预感你是"suffering from buffering"

请注意,您不会向 z3 进程发送任何换行符。此外,z3 可能不会在每个命令后刷新其输出。

与终端程序交互的最佳方式是通过伪 tty。以下是对此类设置如何工作的说明:http://www.rkoucha.fr/tech_corner/pty_pdip.html

【讨论】:

  • 我忘记了换行符 xD。现在它正在工作,我不知道伪 tty,所以谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多