关于cykwin中haskell程序的stdout缓冲区的问题

时间:2011-01-14 08:20:46

标签: haskell ssh cygwin buffer stdout

我有一个简单的haskell程序,

  1. 使用'\ n'向用户提示一些消息
  2. 等待用户输入
  3. 打印用户的输入

如果我从命令提示符或从命令提示符启动的cygwin shell启动程序,则可以。

但是如果我从连接到本地cygwin环境的ssh shell启动程序,程序在退出之前不会将任何内容写回终端。看起来ssh shell中STDOUT的缓冲区不是行缓冲的,而是块缓冲的。

我不想手动冲洗。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

据推测,你的Haskell程序不是Cygwin程序,即它没有与Cygwin DLL链接。 SSH连接在服务器端分配一个所谓的伪终端(pty)设备,Cygwin使用Windows管道实现。非Cygwin程序只能看到管道,而他们可能希望与Windows控制台窗口交谈。缓冲问题是一个可能的结果。请参阅此主题以获取进一步说明和可能的解决方法:http://code.google.com/p/mintty/issues/detail?id=56

答案 1 :(得分:2)

您可以手动将缓冲模式设置为您需要的模式:

import System.IO

main = do
  hSetBuffering stdout LineBuffering
  hSetBuffering stdin LineBuffering

有关详细信息,请参阅System.IO.hSetBuffering

答案 2 :(得分:1)

您没有说明如何在ssh下启动您的程序。

如果您只是一步完成,例如

ssh localhost myprogram

然后可能没有分配终端,这通常会导致程序的输出被块缓冲而不是行缓冲。

您可以使用-t切换到ssh来避免这种情况(请查看您的手册以确定):

ssh -t localhost myprogram

另一方面,如果您正在单独启动程序,那么

ssh localhost
myprogram

那么这不太可能是原因。