Вопрос

I would like to monitor changes to a directory/file.If I want to monitor say only 5 events with the following masks

IN_OPEN
IN_CREATE
IN_DELETE
IN_CLOSE_WRITE

for example,

do i have to call the inotify_add_watch() on each of the masks or is there a way to bunch the masks together in such a way that the inotify_add_watch is called once?

Это было полезно?

Решение

They can be 'or'ed in one call to inotify_add_watch() ie:

wd = inotify_add_watch(fd, path, IN_CREATE|IN_DELETE);

Any combination of bits may be 'or'ed within the following limits:

/* the following are legal, implemented events that user-space can watch for */
#define IN_ACCESS           0x00000001  /* File was accessed */
#define IN_MODIFY           0x00000002  /* File was modified */
#define IN_ATTRIB           0x00000004  /* Metadata changed */
#define IN_CLOSE_WRITE      0x00000008  /* Writtable file was closed */
#define IN_CLOSE_NOWRITE    0x00000010  /* Unwrittable file closed */
#define IN_OPEN             0x00000020  /* File was opened */
#define IN_MOVED_FROM       0x00000040  /* File was moved from X */
#define IN_MOVED_TO         0x00000080  /* File was moved to Y */
#define IN_CREATE           0x00000100  /* Subfile was created */
#define IN_DELETE           0x00000200  /* Subfile was deleted */
#define IN_DELETE_SELF      0x00000400  /* Self was deleted */

/* the following are legal events.  they are sent as needed to any watch */
#define IN_UNMOUNT          0x00002000  /* Backing fs was unmounted */
#define IN_Q_OVERFLOW       0x00004000  /* Event queued overflowed */
#define IN_IGNORED          0x00008000  /* File was ignored */

/* helper events */
#define IN_CLOSE            (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */
#define IN_MOVE             (IN_MOVED_FROM | IN_MOVED_TO) /* moves */

/* special flags */
#define IN_ISDIR            0x40000000  /* event occurred against dir */
#define IN_ONESHOT          0x80000000  /* only send event once */

/*
 * All of the events - we build the list by hand so that we can add flags in
 * the future and not break backward compatibility.  Apps will get only the
 * events that they originally wanted.  Be sure to add new events here!
 */
#define IN_ALL_EVENTS (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \
         IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
         IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF)

(The above is from inotify.h)

Другие советы

You may use the "OR" operation to combine the masks:

  wd = inotify_add_watch( fd, "<path of dir>", IN_CREATE | IN_DELETE );

Otherwise if you want to use all the masks then use

  wfd = inotify_add_watch(ifd,"<path of dir>",IN_ALL_EVENTS);

This is combination of all the masks.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top