Вот пример C, использующий только inotify. Несмотря на то, что он автономен, его можно изменить для работы в режиме ожидания (вместо while (1)) и вызова обратного вызова (вместо printf)
/* inotify us of the file changes in directory */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>
#define EVENT_SIZE ( sizeof (struct inotify_event) )
#define EVENT_BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) )
int main(int argc, char** argv){
int length, i, watch, fd = inotify_init();
char buffer[EVENT_BUF_LEN];
if ( fd < 0 ) perror( "inotify init failed" );
watch = inotify_add_watch( fd, argv[1], /* should check if argv[1] is a dir */
IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO | IN_ATTRIB );
while (1){
i=0;
length = read( fd, buffer, EVENT_BUF_LEN );
if ( length < 0 ) perror( "reading inotify fd" );
while ( i < length ) {
struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
if ( event->len ) {
if (event->mask & IN_ATTRIB)printf("%s sttributes changed\n",event->name);
if (event->mask & IN_CREATE)printf("%s created\n",event->name);
if (event->mask & IN_DELETE)printf("%s deleted\n",event->name);
if (event->mask & IN_MODIFY)printf("%s modified\n",event->name);
if (event->mask & IN_MOVED_FROM)printf("%s moved out\n",event->name);
if (event->mask & IN_MOVED_TO)printf("%s moved in\n",event->name);
}
i += EVENT_SIZE + event->len;
}
}
inotify_rm_watch( fd, watch );
close( fd );
}