Thread Mehrere Prozesse gleichzeitig auf eine Datei... (16 answers)
Opened by Fatso Keratso at 2006-03-27 16:16

Dubu
 2006-03-28 00:20
#64097 #64097
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=GwenDragon,27.03.2006, 14:20]Wenn Prozess A die Datei mit LOCK_EX gesperrt hat, kann Prozess B diese nicht öffnen, da sie exclusiv gesperrt ist.
Das open schlägt fehl.[/quote]
Wenn ich das richtig sehe (und richtig getestet habe), sind Locks sowohl unter Linux 2.6.x als auch unter Windows XP advisory, wie auch als "traditionelles Verhalten" in der Manpage beschrieben. Sie hindern also andere Prozesse nicht am Überschreiben oder Löschen einer Datei. Das open() im zweiten (dritten, vierten, etc.) Prozess kümmert sich also überhaupt nicht um das Lock, aber das anschließende flock() kehrt erst dann zurück, wenn der erste Prozess das Lock entfernt.

Fatso Keratso hat also auch recht mit seiner Vermutung, dass der zweite Prozess einfach "hängt", bis die Datei wieder freigegeben ist.

Zum Testen einfach das folgende Progrämmchen zweimal (oder mehr) parallel in zwei Shells starten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw/:DEFAULT :flock/;

print "$$: Before open.\n";
sysopen (FILE, 'lockedfile', O_RDWR | O_CREAT) or die "$$: cannot open file: $!\n";

### Einfacher, legt die Datei aber nicht an, wenn sie noch nicht existiert:
# open FILE, '+<', 'lockedfile' or die "cannot open file (proc $$): $!\n";

print "$$: Before flock.\n";
flock FILE, LOCK_EX;
print "$$: Writing to file.\n";
print FILE "Here is process $$.\n";
print "$$: Sleeping.\n";
sleep 30;
print "$$: Closing file.\n";
close FILE;
print "$$: Finished.\n";

Man kann gut verfolgen, wie der als zweites gestartete Prozess im flock() wartet, bis der erste die Datei schließt (und damit das Lock implizit freigibt).

Ein zusätzliche Schicht mit Semaphoren halte ich für überflüssig.

View full thread Mehrere Prozesse gleichzeitig auf eine Datei...