3

システムの USB キーを監視したいと考えています。それらは常に /media にマウントされていることがわかっているので、inotify を使用して /media を監視します。一部の USB キーは、プラグを差し込むとフォルダー (sda など) を作成し、それはプラグを抜くまで残ります。また、フォルダー (sda など) を作成し、すぐに削除して新しいフォルダー (sda1 など) を作成するものもあります。これは、キーのパーティションによるものです。

ただし、inotify は最初のフォルダーの作成と削除のイベントのみをキャッチし、2 番目のフォルダーの作成を見逃すことがあります。/media を手動で確認すると、2 番目のフォルダーは存在しますが、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;

        }

    }

}

何がうまくいかないのですか?

4

3 に答える 3

3

その間、これは inotify の既知の問題であることがわかりました。2 つのイベントが事実上同時に発生した場合、inotify はそのうちの 1 つだけを捕捉します。私の解決策:私はもうinotifyを使用しませんが、代わりにマシンに接続されたデバイスを監視するためにlibudevを使用しました...

于 2013-07-12T07:50:46.017 に答える
1
  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

于 2013-07-04T07:34:22.667 に答える