gpt4 book ai didi

除非缓冲模式为 NoBuffering,否则在后台运行的 Haskell 程序不会将输出重定向到文件

转载 作者:行者123 更新时间:2023-12-05 00:19:34 25 4
gpt4 key购买 nike

我有一个 Haskell 程序可以定期记录一些数据。当我将它作为后台进程运行时,我的日志语句不会重定向到我的日志文件,除非我将缓冲模式更改为 NoBuffering .我不明白为什么 LineBuffering 的默认设置不起作用。

这是我的测试程序:

import Control.Concurrent (forkIO, threadDelay)
import Control.Monad (forever)
import System.IO (BufferMode(..), hSetBuffering, stdout)

main :: IO ()
main = forever $ do
-- hSetBuffering stdout NoBuffering
threadDelay $ 1000 * 1000
putStrLn "log"

当我在控制台中正常运行这个程序时,我得到了预期的输出:
$ ./Main
log
log
log

每秒输出一次“日志”。当我将它重定向到一个文件时,它也按预期工作:
$ ./Main >log
^C
$ cat log
log
log
log

但是,当我将它作为后台进程运行时:
$ ./Main >log &
$ cat log

然后没有任何内容写入日志文件,除非我取消注释将 stdout 缓冲设置为 NoBuffering 的行.

我用了 hGetBuffering函数来确定默认缓冲设置,它是 LineBuffering .考虑到每个“日志”语句确实在不同的行上,为什么我需要将缓冲模式设置为 NoBuffering为了将日志写入日志文件? IE。当缓冲区模式设置为 LineBuffering 时,为什么缓冲区不会在每个换行符处刷新?

最佳答案

请参阅对问题的评论。添加此答案主要是为了将问题标记为“已回答”。

没有必要将缓冲模式严格设置为 NoBuffering -- 要么是,要么LineBuffering导致按预期创建日志输出。

问题是默认值是 BlockBuffering ,不是 LineBuffering , 当程序在后台模式下运行时。我不认为在后台模式下运行程序会影响标准输出缓冲的默认设置。

关于除非缓冲模式为 NoBuffering,否则在后台运行的 Haskell 程序不会将输出重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49166131/

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