我有一个简单的haskell程序,
如果我从命令提示符或从命令提示符启动的cygwin shell启动程序,则可以。
但是如果我从连接到本地cygwin环境的ssh shell启动程序,程序在退出之前不会将任何内容写回终端。看起来ssh shell中STDOUT的缓冲区不是行缓冲的,而是块缓冲的。
我不想手动冲洗。我该如何解决这个问题?
答案 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
那么这不太可能是原因。