2009-05-19 14 views
2

EDIT: Ich habe schließlich inotify verwendet. Wie StefanB sagt, Inotify ist die zu verwendende Sache. Ich habe einen Tail-Klon gefunden, der inotify verwendet, um den -f-Modus inotail zu implementieren.Benutzerdefinierte Implementierung der "Tail-f" -Funktionalität in C

Original Frage Text:

Ich versuche, die "tail -f" Logik in einem C-Projekt zu implementieren, für die Prototyping Zweck ich es in Python wie folgt entwickelt:


    # A forever loop, each 5 seconds writes a line into file.txt 
    from time import * 

    while 1: 
     sleep(5) 
     file = open("file.txt", "a") 
     file.write("This is a test\n") 
     file.close() 

Die nächste Code folgt den eOF von datei.txt (durch den Code aktualisiert oben)


    # tail -f 
    from time import * 

    file = open("file.txt", "r") 
    file.seek(0, 2) 

    while 1: 
     line = file.readline() 
     if not line: 
      sleep(1) 
     else: 
      print line 

    file.close() 

Alle funktionieren gut, aber die C-Implementierung funktioniert nicht (es gibt keinen Check-Fehlercode). Die Einbeziehung von stdio.h, string.h und unistd.h entfällt (die Einfärbung verbirgt den Header-Include-Code).


    #define LINE_LEN 256 

    int main(int argc, char **argv) 
    { 
     FILE *f; 
     char line[LINE_LEN]; 

     f = fopen("file.txt", "r"); 

     fseek(f, 0, SEEK_END); 

     while (1) 
     { 
      fgets(line, LINE_LEN, f); 

      if (strlen(line) == 0) 
      { 
       sleep(1); 
      } 
      else 
      { 
       printf("Readed: %s", line); 
      } 
     } 

     fclose(f); 

     return 0; 
    } 

Eine Idee?

Ist eine gute Idee, implementieren Sie es mit einer Umfrage() statt der vorgestellten Lösung ?.

Vielen Dank im Voraus.

Antwort

3

EDIT: Scheint wie inotify die Sache ist, zu verwenden. Es sollte seit 2.6.13 im Linux Kernel enthalten sein. An article from IBM developerworks about inotify.

Zurück Antwort:

Werfen Sie einen Blick auf Linux File Alteration Monitor (in Linux-Kernel 2.4.x>). Es ist ein Framework, mit dem Sie Dateiänderungen abonnieren können und Sie erhalten einen Rückruf vom Kernel, wenn Änderungen stattfinden. Dies sollte besser sein als Umfragen.

Examples wie für Dateiänderungen abzufragen Besuche Abschnitte für Datei Warten ändert und Polling für Datei ändert.

Ich habe es noch nicht ausprobiert.

3

Sobald eine FILE * einen Fehler oder eof festgestellt hat, wird der interne Status so gesetzt, dass bei nachfolgenden Aufrufen weiterhin Fehler oder eof zurückgegeben wird. Sie müssen clearerr(f); aufrufen, nachdem der Ruhezustand zurückkehrt, um die eof-Einstellung zu löschen und es zu versuchen, mehr Daten aus der Datei zu lesen.

+0

Ich habe es versucht, aber ich habe das gleiche Verhalten erhalten. Danke! –

2

Vom tailman page:

-f Stoppen Sie nicht, wenn am Ende der Datei erreicht ist, sondern für zusätzliche Daten zu warten, um an den Eingang angehängt werden. Wenn die Datei ersetzt wird (d. H. ändert sich die Inode-Nummer), wird die Datei erneut geöffnet, und Sie können fortfahren. Wenn die Datei abgeschnitten wird, setzt Tail seine Position an den Anfang zurück. Dies macht Schwanz nützlicher für das Ansehen von Dateien, die gedreht werden können. Die Option -f wird ignoriert, wenn der Standardeintrag eine Pipe ist, aber nicht, wenn es sich um einen FIFO handelt.

So könnte man das Gleiche tun:

  1. Verwenden stat() die Inode-Nummer der Datei
  2. Zeigen Sie den Inhalt dieser Datei zu lesen. Speichern Sie die Position des Dateideskriptors zB p = ftell (fd)
  3. Verwenden Sie stat() erneut, und sehen Sie, ob sich der Inode geändert hat. Wenn ja, zeigen Sie den Inhalt der Datei von der Position p weiter
  4. Repeat
+0

Schön! Ich ignorierte den Man Pages Abschnitt. Vielen Dank! –