Thread Datei sperren: nochma dazu (8 answers)
Opened by mordur at 2004-06-17 11:33

ptk
 2004-06-21 18:40
#83519 #83519
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich hab mal nachgeforscht: es gibt tatsaechlich mandatory locks fuer Linux. Allerdings ist die Handhabung etwas sperrig und ein geeignetes Modul scheint zu fehlen. Hier ist aber funktionierender Beispielcode:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use strict;
use Fcntl qw(F_SETLK F_WRLCK SEEK_SET);

BEGIN {
# c2ph says: typedef='s2 l2 i', sizeof=16
my $FLOCK_STRUCT = 's s l l i';

sub linux_flock {
if (wantarray) {
my ($type, $whence, $start, $len, $pid) =
unpack($FLOCK_STRUCT, $_[0]);
return ($type, $whence, $start, $len, $pid);
} else {
my ($type, $whence, $start, $len, $pid) = @_;
return pack($FLOCK_STRUCT,
$type, $whence, $start, $len, $pid);
}
}

}

if (fork != 0) { # parent
open(BLA, ">/tmp/bla") or die $!;
chmod 02644, "/tmp/bla" or die $!;
warn "lock ...";
fcntl(*BLA, F_SETLK, linux_flock(F_WRLCK, SEEK_SET, 0, 0, 0)) or die $!;
warn "lock done...";
} else {
sleep 1;
warn "try to open in other process";
open(BLA, ">/tmp/bla") or die $!;
warn "open was successful";
}


Die Partition, auf der die Datei erstellt wird, muss mit "mand" gemountet sein. Ich konnte das auf meiner Maschine nachtraeglich mit
Code: (dl )
mount -o remount,mand /
aendern. Weiterhin muss die gelockte Datei eine merkwuerdige Rechtekombination haben: setgid-Bit gesetzt und group-execute geloescht. Im Listing von ls -al muesste die Datei so aussehen:
Code: (dl )
-rw-r-Sr--    1 nobody  nobody         0 Jun 21 16:36 /tmp/bla

Weiterhin muss statt flock() fcntl() zusammen mit F_SETLK verwendet werden. Leider habe ich zum Erstellen der Lock-Struktur kein Modul gefunden, aber der obige Code, teilweise uebernommen aus dem Perl Cookbook, erleichtert die Arbeit. Weitere Referenzen findet man in der Manpage zu fcntl(2) und hier.

View full thread Datei sperren: nochma dazu