Вопрос о буфере stdout программ haskell в cygwin - PullRequest
1 голос
/ 14 января 2011

У меня есть простая программа на Haskell, которая делает

  1. запросить какое-либо сообщение для пользователя с помощью \ n
  2. ожидание ввода пользователя
  3. печать ввода пользователя

Если я запускаю программу из командной строки или из оболочки cygwin, которая запускается из командной строки, это нормально.

Но если я запускаю программу из оболочки ssh, которая подключена к локальной среде cygwin, программа ничего не записывает обратно в терминал, пока не завершится. Похоже, что буфер для STDOUT в оболочке ssh не буферизован строкой, а буферизован блоком.

Я не хочу промывать вручную. Как мне решить проблему?

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Предположительно, ваша программа на Haskell не является программой Cygwin, т.е. она не связана с Cygwin DLL.Соединения SSH выделяют так называемое устройство псевдотерминала (pty) на стороне сервера, которое Cygwin реализует, используя каналы Windows.Программы, отличные от Cygwin, видят только каналы, в то время как они могут ожидать общения с окном консоли Windows.Проблемы с буферизацией являются одним из возможных последствий этого.См. Эту ветку для дальнейшего объяснения и возможных обходных путей: http://code.google.com/p/mintty/issues/detail?id=56.

2 голосов
/ 15 января 2011

Вы можете вручную установить нужный режим буферизации:

import System.IO

main = do
  hSetBuffering stdout LineBuffering
  hSetBuffering stdin LineBuffering

Для получения дополнительной информации см. System.IO.hSetBuffering .

1 голос
/ 14 января 2011

Вы не говорите, как запускаете программу под ssh.

Если вы делаете это за один шаг, например

ssh localhost myprogram

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

Вы можете избежать этого, используя переключатель -t на ssh (проверьте руководство, чтобы убедиться):

ssh -t localhost myprogram

Если, с другой стороны, вы используете отдельный шаг для запуска вашей программы

ssh localhost
myprogram

тогда вряд ли это будет причиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...