簡體   English   中英

關於Cygwin中Haskell程序的stdout緩沖區的問題

[英]Question about haskell programs' stdout buffer in cygwin

我有一個簡單的haskell程序,

  1. 使用“ \\ n”向用戶提示一些消息
  2. 等待用戶輸入
  3. 打印用戶輸入

如果我從命令提示符下啟動程序,或者從命令提示符下啟動的cygwin shell啟動程序,則可以。

但是,如果我從連接到本地cygwin環境的ssh shell啟動程序,則該程序在退出之前不會將任何內容寫回終端。 看起來ssh shell中STDOUT的緩沖區不是行緩沖而是塊緩沖。

我不想手動沖洗。 我該如何解決該問題?

大概您的Haskell程序不是Cygwin程序,即它未與Cygwin DLL鏈接。 SSH連接在服務器端分配了一個所謂的偽終端(pty)設備,Cygwin使用Windows管道實現了該設備。 非Cygwin程序只能看到管道,而他們可能希望與Windows控制台窗口進行通信。 緩沖問題是其可能的后果之一。 有關更多說明和可能的解決方法,請參見此線程: http : //code.google.com/p/mintty/issues/detail ?id= 56

您可以手動將緩沖模式設置為所需的模式:

import System.IO

main = do
  hSetBuffering stdout LineBuffering
  hSetBuffering stdin LineBuffering

有關更多信息,請參見System.IO.hSetBuffering

您沒有說如何在ssh下啟動程序。

如果要一步完成,例如

ssh localhost myprogram

則有可能未分配終端,這通常會導致程序的輸出被塊緩沖而不是行緩沖。

您可以通過使用-t開關來ssh來避免這種情況(請務必查看手冊):

ssh -t localhost myprogram

另一方面,如果您只是作為啟動程序的一個單獨步驟

ssh localhost
myprogram

那么這不太可能是原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM