Ermitteln von Änderungen an einer geöffneten Datei

8

Angenommen, ich habe eine offene Datei. Wie kann ich feststellen, wenn die Datei von einem anderen Programm im Hintergrund geändert wird. Einige Texteditoren können die geöffnete Datei erkennen und aktualisieren, wenn sie von einem anderen Prozess geändert wird.

Ich frage speziell dafür mit C unter Linux (das scheint OS-abhängig zu sein).

    
Atilla Filiz 22.01.2009, 11:33
quelle

3 Antworten

11

Wenn Sie die Datei nicht mit stat abfragen möchten und Linux-spezifisch ist, können Sie die inotify-API verwenden. Ihr Kernel muss 2.6.13 oder neuer und glibc 2.4 oder neuer sein (das sind sie, wenn Sie etwas aus den letzten 2 oder 3 Jahren anvisieren). Die API gibt Ihnen im Grunde einen Dateideskriptor, mit dem Sie poll oder select und read erhalten können, um Informationen über modifizierte Dateien zu erhalten. Wenn Ihre Anwendung wie ein Editor interaktiv ist, wird normalerweise eine Art Ereignisschleife verwendet, die select oder poll aufruft und Ihren Inotify-Dateideskriptor für Ereignisse beobachten kann.

Die Verwendung von inotify ist im Allgemeinen stat vorzuziehen, da Sie sofort Benachrichtigungen erhalten und keine Zeit und Festplatten-E / A-Abfragen verschwenden, wenn sich die Datei nicht ändert. Der Nachteil ist, dass es möglicherweise nicht über NFS oder andere vernetzte Dateisysteme funktioniert und nicht tragbar ist.

Diese Seite bei IBM Developerworks enthält einen Beispielcode für C und < Eine href="http://linux.die.net/man/7/notify"> man-Seite ist die definitive Referenz.

    
Doug 22.01.2009, 12:07
quelle
5
___ answer468794 ___

Texteditoren, die ich unter Windows und Linux gesehen habe, haben es auf die gleiche Weise gemacht: Sie prüfen nicht, ob sich die Datei tatsächlich geändert hat, sie sehen sich nur die Dateizeit an.

    
___ qstnhdr ___ Ermitteln von Änderungen an einer geöffneten Datei ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ qstntxt ___

Angenommen, ich habe eine offene Datei. Wie kann ich feststellen, wenn die Datei von einem anderen Programm im Hintergrund geändert wird. Einige Texteditoren können die geöffnete Datei erkennen und aktualisieren, wenn sie von einem anderen Prozess geändert wird.

Ich frage speziell dafür mit C unter Linux (das scheint OS-abhängig zu sein).

    
___ tag123linux ___ LINUX FRAGEN MÜSSEN PROGRAMMIEREN VERWANDT SEIN. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf das Programmieren mit Linux-APIs oder das Linux-spezifische Verhalten bezieht, nicht nur, weil Sie Ihren Code unter Linux ausführen. Wenn Sie Linux-Unterstützung benötigen, können Sie https://unix.stackexchange.com oder https://askubuntu.com ausprobieren ___ tag123file ___ Ein Block beliebiger Informationen oder Ressourcen zum Speichern von Informationen, auf die der stringbasierte Name oder Pfad zugreifen kann. Dateien stehen Computerprogrammen zur Verfügung und basieren normalerweise auf einer Art persistentem Speicher. ___ answer4688800 ___

Verwenden Sie die Funktion stat . Beispiel auf der Seite.

    
___ answer468876 ___

Wenn Sie die Datei nicht mit %code% abfragen möchten und Linux-spezifisch ist, können Sie die inotify-API verwenden. Ihr Kernel muss 2.6.13 oder neuer und glibc 2.4 oder neuer sein (das sind sie, wenn Sie etwas aus den letzten 2 oder 3 Jahren anvisieren). Die API gibt Ihnen im Grunde einen Dateideskriptor, mit dem Sie %code% oder %code% und %code% erhalten können, um Informationen über modifizierte Dateien zu erhalten. Wenn Ihre Anwendung wie ein Editor interaktiv ist, wird normalerweise eine Art Ereignisschleife verwendet, die %code% oder %code% aufruft und Ihren Inotify-Dateideskriptor für Ereignisse beobachten kann.

Die Verwendung von inotify ist im Allgemeinen %code% vorzuziehen, da Sie sofort Benachrichtigungen erhalten und keine Zeit und Festplatten-E / A-Abfragen verschwenden, wenn sich die Datei nicht ändert. Der Nachteil ist, dass es möglicherweise nicht über NFS oder andere vernetzte Dateisysteme funktioniert und nicht tragbar ist.

Diese Seite bei IBM Developerworks enthält einen Beispielcode für C und < Eine href="http://linux.die.net/man/7/notify"> man-Seite ist die definitive Referenz.

    
___
Aif 22.01.2009 11:42
quelle
3

Texteditoren, die ich unter Windows und Linux gesehen habe, haben es auf die gleiche Weise gemacht: Sie prüfen nicht, ob sich die Datei tatsächlich geändert hat, sie sehen sich nur die Dateizeit an.

    
bobince 22.01.2009 11:40
quelle

Tags und Links