4

inotify に関連する質問を検索しましたが、これは少し異なります...

次のコードを使用して、1 つのファイル (ディレクトリではない) の変更を監視します。テストでは、ターゲット ファイルを保存すると read() が返されます。つまり、動作します。しかし、event->mask は 32768 で、IN_MODIFY ではなく、name は空です。別の問題: 継続的に監視することはできません。ファイルを 2 回目に変更すると、応答がありません。お手伝いありがとう!

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

#define EVENT_SIZE  (sizeof (struct inotify_event))
#define BUF_LEN        (16 * (EVENT_SIZE + 16))

int main()
{
    int fd;
    fd = inotify_init();
    if (fd < 0)
        perror("inotify_init()");

    int wd;
    wd = inotify_add_watch(fd, "target.txt", IN_MODIFY);
    if (wd < 0)
        perror("inotify_add_watch");

    char buf[BUF_LEN];
    int len;

start:

    len = read(fd, buf, BUF_LEN);

    if (len > 0)
    {
        int i = 0;
        while (i < len)
        {
            struct inotify_event *event;
            event = (struct inotify_event *) &buf[i];

            printf("wd=%d mask=%x cookie=%u len=%u\n",
                event->wd, event->mask,
                event->cookie, event->len);

            if (event->mask & IN_MODIFY)
                printf("file modified %s", event->name);

            if (event->len)
                printf("name=%s\n", event->name);

            i += EVENT_SIZE + event->len;
        }
    }

    goto start;

    return 0;
}
4

2 に答える 2

6

0x8000対応しIN_IGNOREDます。マスク内のその存在はinotify、ファイルが削除されたために監視が削除されたことを示しています。編集者はおそらく古いファイルを削除し、新しいファイルをその場所に置きました。ウォッチが削除されていたため、ファイルを 2 回変更しても効果はありませんでした。

ディレクトリを監視していないため、名前は返されません。

inotifyマニュアルページから。

このnameフィールドは、監視対象ディレクトリ内のファイルに対してイベントが返された場合にのみ存在します。監視されているディレクトリに関連するファイル パス名を識別します。

...

IN_IGNORED -- 監視が明示的に削除された (inotify_rm_watch(2)) または自動的に削除された (ファイルが削除されたか、ファイル システムがアンマウントされた)。

于 2013-03-12T00:03:12.770 に答える
4

event->mask 32768 は、IN_IGNORED である 0x8000 に相当します。詳細については、「/usr/include/linux/inotify.h」を参照してください。

    if (event->mask & IN_IGNORED) {
        /*Remove watch*/ inotify_rm_watch(fileDescriptor,watchDescriptor)
        /*Add watch again*/ inotify_add_watch
    }
于 2013-03-12T03:40:48.800 に答える