Haskell createProcess и чтение из Handle

когда я использую Haskell createProcess, мне нужно fork раньше, как если бы я использовал exec в c?

Из примеров, которые я видел, и того, что я пробовал, я не думаю, что делаю, но если я прочитаю из выходного дескриптора один раз, я получу ожидаемый результат, но если я попытаюсь прочитать дважды, он не прочитает ни разу.

Например:

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 

Если я выполню одно выполнение, я получу ожидаемый результат, но если я сделаю оба, ничего не произойдет. Я читаю или пишу неправильно на ручках?

Спасибо за любую помощь, которую вы можете оказать.


person Rogerp062    schedule 10.01.2014    source источник
comment
Пожалуйста, покажите ваш импорт. В частности, что такое beginProcess? Я не могу найти это на hoogle или hayoo.   -  person ErikR    schedule 10.01.2014
comment
Библиотека process очень зависит от системы, поэтому вы должны указать, какую платформу вы используете.   -  person user2407038    schedule 10.01.2014


Ответы (1)


У меня есть подозрение, что вы страдаете от буферизации.

Обратите внимание, что вы не передаете никаких новых строк процессу z3. Кроме того, z3 может не сбрасывать вывод после каждой команды.

Лучший способ взаимодействия с терминальной программой — через псевдотерминал. Вот объяснение того, как будет работать такая настройка: http://www.rkoucha.fr/tech_corner/pty_pdip.html

person ErikR    schedule 10.01.2014
comment
Я забыл новую строку xD. Теперь это работает, и я не знал о псевдотерминале, так что спасибо за ваш ответ. - person Rogerp062; 10.01.2014