Stellen Sie sich zwei Prozesse vor, einen Reader und einen Writer, die über eine reguläre Datei auf einer ext3-Fs kommunizieren. Leser hat eine inotify IN_MODIFY
Uhr auf der Akte. Writer schreibt 1000 Bytes in einem einzigen write()
Aufruf in die Datei . Der Reader erhält das Ereignis inotify und ruft fstat
die Datei auf. Was sieht der Leser?
Gibt es eine Garantie, dass Reader mindestens 1000 für
st_size
die Datei zurückerhält ? Aus meinen Experimenten scheint es nicht.Gibt es eine Garantie, dass Reader tatsächlich
read()
1000 Bytes kann?
Dies geschieht auf einer ernsthaften E / A-gebundenen Box. Zum Beispiel sar
zeigt eine Wartezeit von ca. 1 Sekunde. In meinem Fall wartet der Reader tatsächlich 10 Sekunden, nachdem er das Inotify-Ereignis erhalten hat, bevor er anruft stat
, und erhält zu kleine Ergebnisse.
Ich hatte gehofft, dass das inotify-Ereignis erst zugestellt wird, wenn die Datei fertig ist. Was ich vermute, passiert tatsächlich, dass das Ereignis inotify WÄHREND des write()
Aufrufs im Writer ausgelöst wird und die Daten anderen Prozessen auf dem System tatsächlich zur Verfügung stehen, wenn sie bereit sind. In diesem Fall reichen 10s nicht aus.
Ich schätze, ich suche nur nach einer Bestätigung, dass der Kernel tatsächlich so implementiert, wie ich es mir vorstelle. Gibt es auch Optionen, um dieses Verhalten zu ändern?
Was ist der Grund für eine Inotifizierung angesichts dieses Verhaltens? Sie müssen die Datei / das Verzeichnis sowieso abrufen, nachdem Sie das Ereignis erhalten haben, bis die Daten tatsächlich verfügbar sind. Könnte das auch die ganze Zeit tun und die Inotifizierung vergessen.
*** BEARBEITEN ** * * Okay, wie so oft macht das Verhalten, das ich sehe, Sinn, jetzt, wo ich verstehe, was ich wirklich tue. ^ _ ^
Ich antworte tatsächlich auf ein IN_CREATE-Ereignis in dem Verzeichnis, in dem sich die Datei befindet. Daher stat () ich die Datei tatsächlich als Antwort auf die Erstellung der Datei, nicht unbedingt auf das IN_MODIFY-Ereignis, das möglicherweise später eintrifft.
Ich werde meinen Code so ändern, dass ich, sobald ich das Ereignis IN_CREATE erhalte, IN_MODIFY für die Datei selbst abonniere und erst dann versuche, die Datei zu lesen, wenn ich das Ereignis IN_MODIFY erhalte. Mir ist klar, dass es dort ein kleines Fenster gibt, in dem ich möglicherweise einen Schreibvorgang in die Datei verpasse. Dies ist jedoch für meine Anwendung akzeptabel, da die Datei im schlimmsten Fall nach einer maximalen Anzahl von Sekunden geschlossen wird.