Skip to content

Inotify

Inotify is a kernel subsystem designed for monitoring filesystem events. It enables applications to monitor changes to files and directories in real-time, such as creation, deletion, modification, renaming, and more. inotify offers an efficient way to detect changes in the filesystem without the need for polling, thereby conserving system resources.

CONFIG

COFNIG_FS_NOTIFY=y

User Space API

All inotify user interfaces are declared in the file include/sys/inotify.h. And the usage is consistent with the Linux version.

Reading events from an inotify file descriptor

To determine what events have occurred, an application read from the inotify file descriptor. If no events have so far occurred, then, assuming a blocking file descriptor, read will block until at least one event occurs

Each successful read returns a buffer containing one or more of the following structures:

struct inotify_event {
  int      wd;       /* Watch descriptor */
  uint32_t mask;     /* Mask describing event */
  uint32_t cookie;   /* Unique cookie associating related
                       events (for rename(2)) */
  uint32_t len;      /* Size of name field */
  char     name[];   /* Optional null-terminated name */
};

wd identifies the watch for which this event occurs. It is one of the watch descriptors returned by a previous call to inotify_add_watch.

mask contains bits that describe the event that occurred

cookie is a unique integer that connects related events. Currently, this is used only for rename events, and allows the resulting pair of IN_MOVED_FROM and IN_MOVED_TO events to be connected by the application For all other event types, cookie is set to 0.

The name field is present only when an event is returned for a file inside a watched directory; it identifies the filename within the watched directory. This filename is null-terminated, and may include further null bytes ('0') to align subsequent reads to a suitable address boundary.

The len field counts all of the bytes in name, including the null bytes; the length of each inotify_event structure is thus sizeof(struct inotify_event)+len.

inotify events

The inotify_add_watch mask argument and the mask field of the inotify_event structure returned when reading an inotify file descriptor are both bit masks identifying inotify events. The following bits can be specified in mask when calling inotify_add_watch and may be returned in the mask field returned by read.

IN_ACCESS :File was accessed

IN_MODIFY :File was modified (write() or truncate())

IN_ATTRIB :Metadata changed

IN_OPEN :File was opened

IN_CLOSE_WRITE :File opened for writing was closed

IN_CLOSE_NOWRITE : File not opened for writing was closed

IN_MOVED_FROM :File was moved from X

IN_MOVED_TO :File was moved to Y

IN_CREATE :Subfile was created

IN_DELETE :Subfile was deleted

IN_DELETE_SELF :Self was deleted

IN_MOVE_SELF :Self was moved

Examples

Suppose an application is watching the directory dir and the file dir/myfile for all events. The examples below show some events that will be generated for these two objects.

fd = open("dir/myfile", O_RDWR);

: Generates IN_OPEN events for both dir and dir/myfile.

read(fd, buf, count);

: Generates IN_ACCESS events for both dir and dir/myfile.

write(fd, buf, count);

: Generates IN_MODIFY events for both dir and dir/myfile.

fchmod(fd, mode);

: Generates IN_ATTRIB events for both dir and dir/myfile.

NOTE

Inotify file descriptors can be monitored using select, poll, and epoll. When an event is available, the file descriptor indicates as readable.