1

我有一些关于 pyinotify 的基本问题,我似乎无法在其他地方找到答案。

1) 对于连续目录监视器(和事件处理器),是否需要有一个 while(True) 循环,或者通知手表处理连续事件“循环”并在我移除手表时结束?

2) 如果在 inotify 实例“打开”时文件已经存在,会发生什么?最初我只想监视 IN_CREATE 但这不会处理预先存在的文件。

3) 与 #2 类似,如果在我的事件处理器函数中创建文件会发生什么?pyinotify 会将其缓存在其队列中并在“循环”再次开始时对其进行处理,还是会丢失此事件?

4

1 回答 1

2
  • 是否有必要有一个 while( True ) 循环

您需要 a ,但可以通过调用该方法while-loop隐式设置它:notifier.loop

    wm = pyinotify.WatchManager()
    mask = pyinotify.IN_CREATE
    notifier = pyinotify.Notifier(wm, MyProcessEvent(path))
    wdd = wm.add_watch(path, mask, rec=True, auto_add=True)
    notifier.loop()

如果您希望while-loop自己设置,您可以从以下源代码notifier.loop开始:

    while 1:
        try:
            notifier.process_events()
            # check_events is blocking
            if notifier.check_events():
                notifier.read_events()
        except KeyboardInterrupt:
            # Stop monitoring if sigint is caught (Control-C).
            break
    notifier.stop()

要删除特定文件或目录的监视,请调用wm.rm_watch.

  • 如果在 inotify 实例“打开”时文件已经存在,会发生什么?

    wm.add_watch在调用之前不生成任何事件。

  • 如果在我的事件处理器函数中创建文件会发生什么?

    事件在大小为的缓冲区中排队 /proc/sys/fs/inotify/max_queued_events。例如,在我的系统上,该号码是

    % cat /proc/sys/fs/inotify/max_queued_events
    16384
    

    如果文件系统在您处理先前的事件时生成了足够的事件来填满缓冲区,那么您会得到一个IN_Q_OVERFLOW 事件。

    请参阅blucz 答案中的评论。

于 2011-12-19T14:37:53.797 回答