Inotify allows one to monitor files or directories for one or more events, like dnotify but better. All about the Linux kernels inotify component, brief sample code and updates about removal of /dev/inotify in favour of system calls.
This section is in a work in progress.
Inotify is a replacement for dnotify, it's written by Robert Love and John McCutchan.
It's not fully part of the kernel, there is are patchs for Linux >=2.6
The interface is via device node (/dev/inotify) and it's controlled via IOCTL, super easy!
The inotify interface is now done via system calls inotify_ini(), inotify_add_watch(), inotify_rm_watch() and then using plain old read().
There are 15 different events that inotify will tell you about directories or files that are being watched including READ, APPEND, CREATE, MOVE and CLOSE_WRITE.
Before proceeding you should understand the Linux kernel build process, how to use commands at a bash prompt, using patch and make. Knowledge of C or PERL is useful in addition to being required to understand what is happening here.
Fetch the source for the Linux kernel version 2.6.8.1; no other versions have been tested. Then apply the patch. Please note that the patch provided here is different that what is provided by Robert or John. Their patches are primarily meant for developers and kernel hacker types. This patch is for administrators or application developers who need the functionality of inotify. It's been edited to work in the environment described below and fit the expecations of the commands below.
patch -p0 < inotify-XXX.patchNow you can use the PERL program below to check it out.
/proc/sys/fs/inotify/.
Incomplete, for a better example look at the Beagle source code in glue/inotify-glue.c.
// Initialize Inotify fd = inotify_init (); if (fd < 0) return -errno; // Add a Watch int wd; wd = inotify_add_watch (fd, filename, mask); if (wd < 0) return -errno; // Read an inotify event (buffer should be at least the size of static struc inotify_event *buffer = NULL; buffer_size = sizeof (struct inotify_event); *nr = read (fd, buffer, buffer_size); inotify_rm_watch(wd);
Using Linux::Inotify2, this package also allows the use of (really cool) callback functions on the watch. It's then up to the developer to call poll(), see the Linux::Inotify2 page for more information. This sample takes a more procedural approach.
use Linux::Inotify2;
my $inotify = new Linux::Inotify2();
foreach (@ARGV)
{
$inotify->watch($_, IN_ALL_EVENTS);
}
while (1)
{
# By default this will block until something is read
my @events = $inotify->read();
if (scalar(@events)==0)
{
print "read error: $!";
last;
}
foreach (@events)
{
printf "File: %s; Mask: %d\n", $_->fullname, $_->mask;
}
}