inotify的失踪事件(inotify missing events)

2019-10-17 23:16发布

我想监视我的系统上的USB钥匙。 我知道他们总是安装在/媒体,所以我使用的inotify监视/媒体。 一些USB密钥创建一个文件夹(如SDA)当插入它保持,直到他们已被拔掉,一些创建一个文件夹(如SDA),imediately删除,然后创建一个新的(如SDA1)。 这是由于在关键的分区。

然而,有时inotify的捕获只为创造和第一个文件夹删除的事件,但是偏出第二的创建。 当我手动检查/媒体,第二个文件夹存在,但它从来没有得到通知的inotify。

这种情况很少出现,当它发生,它在设备重新启动后的第一个插头总是。

#include <sys/inotify.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

/* size of the event structure, not counting name */
#define EVENT_SIZE  (sizeof (struct inotify_event))

/* reasonable guess as to size of 32 events */
#define BUF_LEN        (32 * (EVENT_SIZE + 16))

int main(int argc, char **argv) {
    int fd,wd,len,i;
    char buf[BUF_LEN];
    struct inotify_event *event;
    fd_set watch_set;

    fd = inotify_init();
    if (fd < 0) {
        perror("init failed");
        exit(EXIT_FAILURE);
    }

    wd = inotify_add_watch(fd,"/media",IN_ALL_EVENTS);
    if (wd < 0) {
        perror("add watch failed");
        exit(EXIT_FAILURE);
    }

    /* put the file descriptor to the watch list for select() */
    FD_ZERO(&watch_set);
    FD_SET(fd,&watch_set);

    while(1) {
        select(fd+1,&watch_set,NULL,NULL,NULL);
        len = read(fd,buf,BUF_LEN);
        i=0;
        while(i < len) {

            event = (struct inotify_event *) &buf[i];

            if ((event->mask & IN_CREATE) != 0) {
                printf ("%s created\n",event->name);
            }
            else if ((event->mask & IN_DELETE) != 0) {
                printf ("%s deleted\n",event->name);
            }
            else {
                printf ("wd=%d mask=0x%X cookie=%u len=%u name=%s\n",
                                event->wd, event->mask,
                                event->cookie, event->len, event->name);
            }

            i += EVENT_SIZE + event->len;

        }

    }

}

任何想法是怎么回事?

Answer 1:

与inotify的子文件夹的问题是众所周知的,容易复制:

  1. 启动inotifywait看空tmp目录:

    inotifywait -e创建-m -r --format '%:E&F' ./tmp

  2. 在另一个shell中输入:

    MKDIR TMP / 0 TMP / 0/0 TMP / 0/0/0 TMP / 0/0/0/0

  3. 您将最有可能只获得了第一个子目录的通知。

    创建:ISDIR 0

创建目录的时间之间丢失事件(特别是子目录创建事件)的明显的可能性,你的应用程序得到通知,并添加了新的inotify的手表,让递归监控太不可靠。 唯一安全的选择是扫描新创建的目录的内容。

从inotify的DOC下限制和注意事项

如果监控整个目录树,并在树中创建一个新的子目录,要知道,你的时间创建新的子目录一块手表,可能已经在子目录中创建新的文件。 因此,你可能要添加的手表后,立即扫描子目录的内容。



Answer 2:

  1. 您可以使用inotifywait命令(从inotify-tools包)来监视/ media目录,以检查是否inotify你发生的事件利息。
    参考:
    http://www.noah.org/wiki/Inotify,_FAM,_Gamin#Examples_with_inotify-tools

  2. 如果inotify不命中事件,其原因可能是:
    Inotify不报告在一些但不是所有事件sysfsprocfs
    (好吧,我不能肯定地说。只是我的猜测。)

参考:
http://en.wikipedia.org/wiki/Inotify#Limitations
http://en.wikipedia.org/wiki/Sysfs
http://en.wikipedia.org/wiki/Procfs



Answer 3:

在此期间,我发现,这是inotify的一个已知的问题。 如果两个事件在同一时间几乎出现,inotify的只有抓住其中之一。 我的解决办法:我不使用的inotify了,但花了libudev而不是监视插入到机器设备...



文章来源: inotify missing events
标签: c linux inotify