2010-11-01 3 views
5

Können Sie mir bitte den Inotify-Mechanismus erklären? Ich habe im Internet darüber gesucht, aber was ich verstanden habe, ist, dass, wenn ich die Änderungen in einer Datei sehen möchte, ich mit der "Lese" -Funktion abfragen muss. Gibt es irgendeine Callback-Funktion, die mich benachrichtigt, wenn sich die Datei ohne Abfrage ändert?linux, inotify - wie abonnieren?

Danke,

Antwort

0

Nein, inotify erfordert Abfragen.

Die Registrierung eines Rückrufs mit Hilfe des Signals (wie vorgeschlagen) ist IMO schlechter als reguläres Polling.

+0

zur Kenntnis genommen, aber können Sie erarbeiten * warum * wäre es noch schlimmer sein? :) –

+1

@ Frédéric Hamidi Ein Problem mit Signalen ist, dass sie sich nicht sehr gut mit Ausnahmen mischen. Das zweite Problem ist, dass Signalprovider so wenig wie möglich arbeiten und zurückkehren sollten. –

+2

Nur wenn Sie Ausnahmen vom Signalhandler durchlaufen. Und die Tatsache, dass Signalprovider möglichst wenig Arbeit verrichten sollten, bedeutet nicht, dass die Abfrage bevorzugt wird. Beispielsweise könnte Ihr Hauptcode eine Pipe erstellen, den Signalhandler einrichten und dann auf der Pipe auswählen. Der Signal-Handler schreibt ein einzelnes Zeichen in die Pipe und wird dann beendet. Schreiben ist async-signalsicher. Die Steuerung kehrt zu Ihrem Hauptcode zurück und wählt Returns aus. Sie haben einen minimalen Signal-Handler und müssen nicht abfragen. – atomice

2

Ich spekuliere, dass Sie eine GUI-Bibliothek verwenden, die Ereignisse für Sie behandeln.

Die besseren GUI-Bibliotheken haben eine Möglichkeit, Dateideskriptoren zu beobachten. In GTK ist es gtk_input_add_full; in Qt, QSocketNotifier könnte für Sie arbeiten.

+1

Die Links für Sie wurden korrigiert, mit etwas mehr Wiederholungen haben Sie kein Problem damit, sie selbst hinzuzufügen. –

1

Die Inotify-Aufrufe verwenden Dateideskriptoren. Statt der Abfrage können Sie die zurückgegebenen FDs in der Anrufgruppe select() verwenden. Es ist nicht gerade eine Callback-Funktion, sondern reduziert den Overhead, mit dem Sie es zu tun haben.