2012-11-12 3 views
6

Ich versuche, ein Beispiel von inotify in C. ausführen, aber es funktioniert nicht. Ich möchte Änderungen an einer Datei überwachen (die Datei ist tmp.cfg), aber es funktioniert nicht .. Ich weiß nicht, ob ich es richtig ausführe, weil ich verstehe, wie man Verzeichnisse überwacht, aber nicht a einzelne Datei Heres das Beispiel:Inotify-Datei in C

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/inotify.h> 
#include <unistd.h> 

#define EVENT_SIZE (sizeof (struct inotify_event)) 
#define BUF_LEN  (1024 * (EVENT_SIZE + 16)) 

int main(int argc, char **argv) 
{ 
    int length, i = 0; 
    int fd; 
    int wd; 
    char buffer[BUF_LEN]; 

    fd = inotify_init(); 

    if (fd < 0) { 
    perror("inotify_init"); 
    } 

    wd = inotify_add_watch(fd, "/home/name/tmp.cfg", 
         IN_MODIFY | IN_CREATE | IN_DELETE); 
    length = read(fd, buffer, BUF_LEN); 

    if (length < 0) { 
    perror("read"); 
    } 

    while (i < length) { 
    struct inotify_event *event = (struct inotify_event *) &buffer[ i ]; 
     if (event->mask & IN_CREATE) { 
      printf("The file %s was created.\n", event->name); 
     } 
     else if (event->mask & IN_DELETE) { 
      printf("The file %s was deleted.\n", event->name); 
     } 
     else if (event->mask & IN_MODIFY) { 
      printf("The file %s was modified.\n", event->name); 
     } 
    i += EVENT_SIZE + event->len; 
    } 

    (void) inotify_rm_watch(fd, wd); 
    (void) close(fd); 

    return 0; 
} 

Sobald ich es laufen, wenn ich etwas auf die Datei schreiben und speichern sie es dann, passiert nichts. ich habe it..the Problem tryed Debuggen scheint der zu sein, wenn (event-> Maske & IN_MODIFY), da es nicht als Modifikation denken erkennt

Antwort

1

ich Sie nicht Ihre Benutzernamen, das ist Ihr Home-Verzeichnis, und du bist nicht die Rückkehr von inotify_add_watch Überprüfung, die wahrscheinlich nicht:

"/home/name/tmp.cfg" 

Edit: Okay zweites Problem, sollten Sie nicht drucken name weil

Das Namensfeld ist nur vorhanden, wenn ein Ereignis für eine Datei in einem überwachten Verzeichnis zurückgegeben wird.

Edit2: drittes Problem, muss die Datei vorhanden sein, bevor Sie das Programm ausführen, weil Sie eine Uhr auf die Datei hinzufügen möchten, empfehle ich Ihnen den Fehler überprüfen von inotify_add_watch

+0

Name ist mein Benutzername –

+0

Ich habe versucht, es zu debuggen..das Problem scheint das If (Ereignis-> Maske & IN_MODIFY) zu sein, da es es nicht als eine Modifikation erkennt –

+0

@ user1693049 Ich habe den Code ausprobiert und es funktioniert hier, sehe kein Problem damit – iabdalkader

2

Sie haben zwei Probleme. Erstens, soweit ich das beurteilen kann, funktioniert inotify nicht wirklich mit Dateien - es braucht einen Verzeichnisnamen zum Ansehen.

Zweitens, Sie verpasst if (event->len) { innerhalb While-Schleife.

Dieser Code funktioniert für mich zum Erstellen, Löschen und Dateien im aktuellen Verzeichnis ändern:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/inotify.h> 
#include <unistd.h> 

#define EVENT_SIZE (sizeof(struct inotify_event)) 
#define BUF_LEN  (1024 * (EVENT_SIZE + 16)) 

int main(int argc, char **argv) { 
    int length, i = 0; 
    int fd; 
    int wd; 
    char buffer[BUF_LEN]; 

    fd = inotify_init(); 

    if (fd < 0) { 
     perror("inotify_init"); 
    } 

    wd = inotify_add_watch(fd, ".", 
     IN_MODIFY | IN_CREATE | IN_DELETE); 
    length = read(fd, buffer, BUF_LEN); 

    if (length < 0) { 
     perror("read"); 
    } 

    while (i < length) { 
     struct inotify_event *event = 
      (struct inotify_event *) &buffer[i]; 
     if (event->len) { 
      if (event->mask & IN_CREATE) { 
       printf("The file %s was created.\n", event->name); 
      } else if (event->mask & IN_DELETE) { 
       printf("The file %s was deleted.\n", event->name); 
      } else if (event->mask & IN_MODIFY) { 
       printf("The file %s was modified.\n", event->name); 
      } 
     } 
     i += EVENT_SIZE + event->len; 
    } 

    (void) inotify_rm_watch(fd, wd); 
    (void) close(fd); 

    return 0; 
} 
+1

es funktioniert auf Dateien, lesen Sie die man Seite – iabdalkader

+0

Sie können Recht haben. Wenn ich jedoch den Dateinamen benutze, scheint die Änderungsbenachrichtigung für mich nicht zu funktionieren. – mvp

+0

Der 'Name' sollte auch nicht gedruckt werden, da dies nur der Fall ist, wenn sich eine Datei im überwachten Verzeichnis ändert. – iabdalkader

1

in eine Datei zu beobachten, wenn die Datei von einem Editor manipuliert wird, die Sie tun können, es zu bearbeiten und ein erstellen Wenn Sie Änderungen vornehmen, werden wahrscheinlich einige Vorgänge ausgeführt, die dazu führen, dass die ursprüngliche Datei, die Sie ansehen möchten, gelöscht wird. Daher werden die Benachrichtigungen beendet, wenn Sie nur die eine Datei ansehen.