昨天给同学们写了一个xinetd小练习:做一个反向回显程序。
为了学习新东西,我尝试实现一个 Haskell 解决方案。微不足道的main = forever $ interact reverse
行不通。我经历了这个问题并做了一个更正的版本:
import Control.Monad
import System.IO
main = forever $ interact revLines
revLines = unlines . map (reverse) . lines
但是这个更正的版本也不起作用。我阅读了缓冲文档并使用了各种设置。如果我设置NoBuffering
or 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