gpt4 book ai didi

Haskell 默认 io 缓冲

转载 作者:行者123 更新时间:2023-12-03 23:41:33 26 4
gpt4 key购买 nike

昨天给同学们写了一个xinetd小练习:做一个反向回显程序。
为了学习新东西,我尝试实现一个 Haskell 解决方案。琐碎的main = forever $ interact reverse不起作用。我经历了this question并制作了一个更正的版本:

import Control.Monad
import System.IO

main = forever $ interact revLines

revLines = unlines . map (reverse) . lines
但是这个更正的版本也不起作用。我读了 buffering documentation并玩了各种设置。
如果我设置 NoBufferingLineBuffering ,我的程序运行正常。最后我打印出标准输入和标准输出的默认缓冲模式。
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功能,我可以使用它检查 handle 的连接。
    作为记录,这是我的最终程序:
    {-# OPTIONS_GHC -W #-}

    import System.IO

    main = do
    hSetBuffering stdin LineBuffering
    hSetBuffering stdout LineBuffering

    interact revLines

    revLines = unlines . map (reverse) . lines

    最佳答案

    它不是特定于 Haskell 的(例如标准 C 库做同样的事情)。
    传统上,如果文件描述符对应于终端,则将缓冲设置为行模式,否则设置为 block 模式。文件描述符类型可以通过 isatty(3) 检查。函数 -- 不确定是否导出到 System.IO .

    是的,如果你依赖它,你需要手动设置缓冲模式。

    顺便说一句,您可以通过将程序运行为 cat | ./prog | cat 来欺骗系统并在命令行中强制进行 block 缓冲。 .

    关于Haskell 默认 io 缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19520885/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com