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 的原因)。

【问题讨论】:

根据平台对hinotitykqueue 进行包装可能会很有趣。 有趣的问题。对不起我也这个,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 在不进行轮询的情况下从数据库中获取实时/新数据?

PHP & MySQL:检查表的数据是不是在没有轮询的情况下发生了变化?

JAVA从服务器推送到客户端

是否有不需要在服务器端修改的情况下轮询的 ajax 替代方案?