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?
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:
fflush(f)
und prüfen, ob der Zeitstempel geändert wurde. fwrite()
, fprintf()
, etc. Irgendwelche Vorschläge?
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.