Ermitteln, ob eine offene Datei in C geändert wurde

8

Gibt es eine Möglichkeit festzustellen, ob eine offene -Datei unter POSIX geändert wurde? Genauer gesagt, wie könnte ich is_modified() unten implementieren?

%Vor%

Um einen Kontext bereitzustellen, schreibe ich ein Modul in C, das für jede Datei seinen Hash in einer Tabelle speichern muss. Die Schnittstelle stellt Wrapper für fopen() und fclose() bereit und das Hashing kann durchgeführt werden, wenn die Datei geschlossen wird. Ich habe mehrere Ansätze dafür gefunden, aber keines ist so effizient, sauber oder fehlerfest, wie ich es gerne hätte:

  • Berechne den Hash jeder Datei, die zum Schreiben geöffnet wurde.
  • fflush(f) und prüfen, ob der Zeitstempel geändert wurde.
  • Bietet Wrapper um fwrite() , fprintf() , etc.

Irgendwelche Vorschläge?

    
nccc 25.12.2011, 04:24
quelle

3 Antworten

6

Ссылка

Sie können die letzte Änderung mit der Funktion stat () überprüfen.

    
nmjohn 25.12.2011 06:03
quelle
3

Da Sie die Handles mit Covern für fopen() und fclose() verteilen, können Sie das Ergebnis von fstat() beim Öffnen der Datei und erneut beim Schließen der Datei aufzeichnen und das Ergebnis vergleichen zwei. Wenn sich etwas geändert hat, haben Sie eine positive Änderung und müssen den Hash erneut berechnen. Wenn sich nichts geändert hat, können Sie einigermaßen zuversichtlich sein, dass Sie die gleiche Datei wie zuvor haben. Wenn Sie diese Ungewissheit beseitigen müssen, müssen Sie den Hash trotzdem neu berechnen, da Sie wissen, dass die Datei während der Berechnung des Hashs durch einen anderen Thread oder einen anderen Prozess geändert werden kann.

Beachten Sie, dass moderne POSIX ( POSIX 2008 ) struct stat mit Zeitmitgliedern zur Verfügung stellt :

  • struct timespec st_atim - Letzter Datenzugriffszeitstempel.
  • struct timespec st_mtim - Letzter Änderungszeitpunkt der Daten.
  • struct timespec st_ctim - Letzte Änderung des Dateistatus timestamp.

Diese bieten eine Auflösung in Nanosekunden zu den Modifikationszeiten. Aus Gründen der Abwärtskompatibilität gibt es wahrscheinlich Makros wie:

%Vor%

Obwohl dies AFAICS ist, schreibt der POSIX-Standard dies nicht vor. Jedoch wurden die st_Xtime Namen seit dem Beginn der (Unix) Zeit verwendet - Version 7 Unix von 1978 und wahrscheinlich vorher - also werden Systeme älteren Code kompilieren wollen und Makros wie diese eine mäßig schmerzlose Möglichkeit bieten dies zu tun.

    
Jonathan Leffler 25.12.2011 07:21
quelle
3

Sie können das kqueue-Benachrichtigungssystem auch verwenden, um Benachrichtigungen zu erhalten, wenn jemand die Datei ändert und dann Ihre Hash-Einträge ungültig macht / erneut lädt

Mann 2 kqueue

Ссылка

    
jackdoe 25.12.2011 09:03
quelle

Tags und Links