Ich wollte inotify verwenden, um den Inhalt eines Verzeichnisses zu überwachen. Alles scheint gut zu funktionieren, bis ich versuche, eine Datei im Verzeichnis mit dem Befehl mv umzubenennen. Ich erhalte IN_MOVED_FROM wie erwartet, aber IN_MOVED_TO kommt nicht.
Unten ist mein Testprogramm. Kompilieren mit:
g++ -Wall -o test test.cpp
Starten mit:
./test dir_to_watch
#include
#include
#include
#include
#include
#include
#include
int main (int argc, char *argv[])
{
int inotify_fd = inotify_init();
if (inotify_fd < 0)
{
fprintf(stderr, "Inotify-Initialisierung fehlgeschlagen: %m\n");
return 1;
}
int watch_descriptor = inotify_add_watch(inotify_fd,
argv[1],
IN_ALL_EVENTS);
if (watch_descriptor < 0)
{
fprintf(stderr, "Inotify-Überwachung konnte nicht hinzugefügt werden: %m\n");
return 1;
}
union
{
inotify_event event;
char pad[1024];
}
buffer;
struct events
{
int mask;
const char *name;
}
events[] =
{
{IN_ACCESS , "IN_ACCESS "},
{IN_ATTRIB , "IN_ATTRIB "},
{IN_CLOSE_WRITE , "IN_CLOSE_WRITE "},
{IN_CLOSE_NOWRITE , "IN_CLOSE_NOWRITE "},
{IN_CREATE , "IN_CREATE "},
{IN_DELETE , "IN_DELETE "},
{IN_DELETE_SELF , "IN_DELETE_SELF "},
{IN_MODIFY , "IN_MODIFY "},
{IN_MOVE_SELF , "IN_MOVE_SELF "},
{IN_MOVED_FROM , "IN_MOVED_FROM "},
{IN_MOVED_TO , "IN_MOVED_TO "},
{IN_OPEN , "IN_OPEN "},
};
while (read(inotify_fd, &buffer, sizeof buffer) > 0)
{
for (unsigned i = 0; i < sizeof events / sizeof events[0]; i++)
{
if (events[i].mask & buffer.event.mask)
{
if (buffer.event.len)
{
printf("Inotify %s: %s\n", events[i].name, buffer.event.name);
}
else
{
printf("Inotify %s\n", events[i].name);
}
}
}
}
}