Интерактивная коммуникация процессов в Haskell
Я пытаюсь написать программу Haskell, которая выполняет интерактивную программу (также написанную на языке Haskell), отправляя и получая строки текста. Интерактивная программа читает из stdIn и записывает в stdOut, используя стандартную библиотеку Haskell.
Однако это оказалось сложнее, чем я ожидал, вероятно, из-за хаскелловской лени или какой-то другой загадочной вещи, происходящей на заднем плане. Программа, по-видимому, заходит в тупик, и не получает обратно строку текст, который он должен был получить. Он получает текст нормально, если интерактивная программа завершается в результате отправки строки текста, но мне нужно, чтобы программа продолжала работать и получать больше данных (это называется интерактивным по какой-то причине). Иногда он выводит ожидаемый результат только после того, как я убью программу, получающую сообщение. Код выглядит следующим образом:main = do
(hin,hout,herr,pl) <- (runInteractiveCommand "./PlayerMain")
hSetBinaryMode hin False
hSetBinaryMode hout False
hSetBuffering hin LineBuffering
hSetBuffering hout NoBuffering
hPutStr hin "startn"
out <- hGetLine hout
putStrLn out
Я уже пытался заменить ленивые строки строгими данными.Текст, но поведение было то же самое. Есть свет?
1 ответ:
Возможно, причина в том, что выход
Это объясняет, почему вы действительно получаете сообщение, когда программа завершается../PlayerMain
буферизуется../PlayerMain
пишет что-то, что не сбрасывается сразу, а затем зависает, потому что он продолжает ожидать большего количества ввода.Так что, возможно, это сработает, если вы измените
./PlayerMain
и установите егоstdout
наNoBuffering
.