昨天给同学们写了一个xinetd小练习:做一个反向回显程序。
为了学习新东西,我尝试实现一个 Haskell 解决方案。微不足道的main = forever $ interact reverse行不通。我经历了这个问题并做了一个更正的版本:
import Control.Monad
import System.IO
 
main = forever $ interact revLines
 
revLines = unlines . map (reverse) . lines 
但是这个更正的版本也不起作用。我阅读了缓冲文档并使用了各种设置。如果我设置NoBufferingor LineBuffering,我的程序可以正常工作。最后我打印出标准输入和标准输出的默认缓冲模式。
import System.IO
main = do 
  hGetBuffering stdin >>= print 
  hGetBuffering stdout >>= print
如果我BlockBuffering Nothing从 xinetd( ) 运行我的程序,echo "test" | nc localhost 7但从 cli 我有LineBuffering
- 关于缓冲,xinetd tcp 服务和 cli 程序有什么区别?
 - 如果我想用两种运行方法编写一个工作程序,我是否必须手动设置缓冲?
 
编辑:谢谢大家的有用答案。
我接受了 blaze 给出的答案,他用 isatty(3) 给了我一个提示。我再次浏览了 System.IO 文档并找到了hIsTerminalDevice函数,我可以使用它检查句柄的连接。
作为记录,这是我的最终程序:
{-# OPTIONS_GHC -W #-}
import System.IO
 
main = do
  hSetBuffering stdin LineBuffering
  hSetBuffering stdout LineBuffering
  
  interact revLines
 
revLines = unlines . map (reverse) . lines