Интерактивная коммуникация процессов в 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 2

1 ответ:

Возможно, причина в том, что выход ./PlayerMain буферизуется. ./PlayerMain пишет что-то, что не сбрасывается сразу, а затем зависает, потому что он продолжает ожидать большего количества ввода.

Это объясняет, почему вы действительно получаете сообщение, когда программа завершается.

Так что, возможно, это сработает, если вы измените ./PlayerMain и установите его stdout на NoBuffering.