stat und mehrere write in append modus

22/06/2008 - 18:59 von kbsoft | Report spam
Mehrere Prozesse schreiben in eine zentrale Datei (open mit
O_APPEND) . Das Schreiben erfolgt im 'Schreib-Prozess' jeweils nur mit
einem einzigen write(). Die Làngen der einzelnen write() sind bekannt.
Ein anderer Prozess stellt in einem beliebigen Augenblick die aktuelle
Größe der Datei fest mit dem stat-system-call.

Ich hàtte erwartet (da alle write() atomar sein müssten) dass stat()
eine Größe liefern muss, die eine Summe der write() sind, die zu
diesem Augenblick erfolgt sind. Dem scheint aber nicht so. Ich bekomme
bei den Testlàufen manchmal eine Größe, die sozusagen mittendrin eines
write-calls liegt. Die write() Làngen sind manchmal > 512 Byte,
manchmal kleiner. Das ganze auf einer Dual-Core Maschine ,
uname-a:
Linux riga 2.6.16.21-0.21-smp #1 SMP Tue Aug 29 16:42:05 UTC 2006 i686
i686 i386 GNU/Linux

Ich verstehe nicht, was ich falsch mache.

P.S. Wie ist es eigentlich mit dem O_APPEND - ist es garantiert, dass
alle beteiligten Prozesse wirklich das aktuelle Ende der Datei
bekommen.

Mein Suche ergab, dass ein write() nur blockweise-atomar sein sollte -
d.h. nur bei der Grösse unter 512 dies garantiert sei. Kann das jemand
bestàtigen.

Gruss Jan
 

Lesen sie die antworten

#1 Dirk Clemens
23/06/2008 - 17:23 | Warnen spam
wrote:

P.S. Wie ist es eigentlich mit dem O_APPEND - ist es garantiert, dass
alle beteiligten Prozesse wirklich das aktuelle Ende der Datei
bekommen.



man 2 open (linux)
...
O_APPEND
The file is opened in append mode. Before each write(),
the file offset is positioned at the end of the file, as
if with lseek(). O_APPEND may lead to corrupted files on
NFS file systems if more than one process appends data to
a file at once. This is because NFS does not support
appending to a file, so the client kernel has to simulate
it, which can't be done without a race condition.

Antwort: Ja mit Ausnahme NFS.

Ähnliche fragen