Haskell:在不轮询的情况下监控文件(在 linux 中使用 inotify)
Posted
技术标签:
【中文标题】Haskell:在不轮询的情况下监控文件(在 linux 中使用 inotify)【英文标题】:Haskell: Monitor a file without polling (à la inotify in linux) 【发布时间】:2012-11-30 09:47:27 【问题描述】:有没有haskell库函数可以不轮询监控文件?
通过轮询我会做这样的事情:
monitor file mtime handler = do
threadDelay n -- sleep `n` ns
t <- getModificationTime file
if t > mtime
then handler >> monitor file t handler
else monitor file mtime handler
我想要的是一个阻塞的 getModificationTime ,它会被系统唤醒。有货吗?
如果它仅适用于 posix 系统,我会非常高兴,但越便携越好 :-)
编辑:我知道hinotify,但我使用的是 Mac(这就是我提到 POSIX 的原因)。
【问题讨论】:
根据平台对hinotity
和kqueue
进行包装可能会很有趣。
有趣的问题。对不起我也这个,Windows上有什么吗?
【参考方案1】:
kqueue 包应该这样做:http://hackage.haskell.org/package/kqueue
【讨论】:
【参考方案2】:有一个 GSoC 项目导致 fsnotify 包使用系统特定的库,并回退到轮询。它在 Mac 上使用hfsevents。
【讨论】:
似乎是一个不错的库。我尝试构建和安装它(GHC 7.0.3,Mac OS X 10.6),但由于 hfsevents 的问题,它不起作用。所以我会坚持上面的解决方案。 如果您可以向 hfsevents 的维护者提交错误报告以便他修复它,那就太好了。【参考方案3】:Sjoerd Visscher 建议的软件包就像一个魅力(使用 GHC 7.0.3 和 kqueue 0.1.2.4,Mac OS X 10.6 Snow Leopard)。
我使用它编译了一个快速示例(因为我找不到 API 文档,但在 github 上有一些示例):
import Control.Concurrent.MVar
import System.KQueue.HighLevel (watchFile, EventType, Watcher)
import System.Environment (getArgs)
watch :: MVar EventType -> FilePath -> IO Watcher
watch chan file =
let handler ev = putMVar chan ev
in watchFile file handler
listen :: MVar EventType -> IO ()
listen chan = takeMVar chan >>= print >> listen chan
main :: IO ()
main = do
args <- getArgs
chan <- newEmptyMVar
mapM (watch chan) args
listen chan
这将创建一个小程序,您可以将文件路径作为参数传递并监视这些文件。事件通过MVar
反馈并由主线程读取,主线程基本上是由listen
实现的循环。该程序必须使用^C
杀死,因为它被设计为永远运行。
【讨论】:
以上是关于Haskell:在不轮询的情况下监控文件(在 linux 中使用 inotify)的主要内容,如果未能解决你的问题,请参考以下文章
如何在不轮询内核的情况下监控 C 程序中的 NIC 状态(启动/关闭)?
有没有办法在不轮询 REST API 的情况下通知 Google AI Platform 训练作业的状态变化?
如何让 GraphQL 在不进行轮询的情况下从数据库中获取实时/新数据?