Schrift
[thread]712[/thread]

flock funktioniert nicht



<< |< 1 2 3 4 ... 7 >| >> 65 Einträge, 7 Seiten
x-man
 2006-04-17 19:11
#7335 #7335
User since
2003-09-11
67 Artikel
BenutzerIn
[default_avatar]
Erstmal einen schönen Ostermontag!

Nun zur Frage: ich benutze die Funktion flock() in meinem Script. Leider unterstützt mein neuer Provider kein flock(). Was kann ich am besten gegen Datenverlust bei mehreren gleichzeitigen Zugriffen verhindern? Für jede Datei eine lock-Datei erstellen und danach löschen?

Danke!
GwenDragon
 2006-04-17 19:33
#7336 #7336
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Wo steht das, dass es kein flock() gibt?
Bist du sicher, dass du flock richtig aufrufst?
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

x-man
 2006-04-17 19:44
#7337 #7337
User since
2003-09-11
67 Artikel
BenutzerIn
[default_avatar]
Mein Provider hat in seinen FAQs ausdrücklich "verboten", flock zuverwenden. Keine Ahnung warum. Ich habe flock trotzdem verwendet. Es gibt keinen Fehler aber wahrscheinlich auch keinen Schutz, denn Dateien, in die häufig geschrieben wird werden ständig leer (Datenverlust).

So habe ich flock verwendet:

Code: (dl )
1
2
3
4
5
open(FH,">....") or die $!;
flock(FH, 2);
blabla
flock(FH, 8);
close(FH);


oder auch in einer eigenen Funtion:
Code: (dl )
1
2
3
4
5
6
my $flck = 1; #or 0
sub lock{
    local *FH = shift;
    my $mode = shift;
    flock(FH, $mode) if($flck);
}


und der Aufruf:

&lock(*FH, 2); und &lock(*FH, 8);

edit pq: code-tags hinzugefügt
edit: gwendragon: Smilies deaktiviert\n\n

<!--EDIT|GwenDragon|1145291857-->
pq
 2006-04-17 20:29
#7338 #7338
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
besser:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
# ungetestet
use Fcntl qw(:flock);

sub lock {
  my ($fh, $mode) = @_;
  flock $fh, $mode;
}
...
lock(\*FH, LOCK_EX); # exclusive
# lock(\*FH, LOCK_SH); # shared


ein flock $fh, 8 (also unlock) solltest du lassen, denn durch das close wird
ja automatisch der lock aufgehoben. das ist vermutlich auch die fehlerursache.

wenn der provider flock() verbietet, würde ich wechseln.\n\n

<!--EDIT|pq|1145291611-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
x-man
 2006-04-17 20:44
#7339 #7339
User since
2003-09-11
67 Artikel
BenutzerIn
[default_avatar]
Danke, ich werde den Code mal testen.
x-man
 2006-04-17 20:48
#7340 #7340
User since
2003-09-11
67 Artikel
BenutzerIn
[default_avatar]
Gibt es eine elegante Methode, eigene lockfile zu verwenden, damit das Script überall läuft?
pq
 2006-04-17 21:11
#7341 #7341
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=x-man,17.04.2006, 18:48]Gibt es eine elegante Methode, eigene lockfile zu verwenden, damit das Script überall läuft?[/quote]
ich würde den provider wechseln. oder zumindest nach dem grund des
verbots fragen. mir fällt nämlich kein grund ein (außer der server läuft auf Win32...)

ein lockfile kannst du so anlegen:
Code: (dl )
1
2
3
4
5
6
7
if (sysopen "lockfile", O_CREAT | O_EXCL) {
 tu_was();
 unlink "lockfile";
}
else {
 # lockfile konnte nicht geöffnet werden
}

wenn sysopen() fehlschlägt, kannst du es z.B. nach einer wartezeit
nochmal versuchen.
aber bei vielen zugriffen kann es dir passieren, dass du nie zum zug kommst.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
jan
 2006-04-17 22:49
#7342 #7342
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
http://www.awprofessional.com/article....=2&rl=1

beschreibt, wie du das entspannter löst - denn auch mit flock kann's zum datenverlust kommen - immerhin ist zwischen dem open und dem flock sonst immer noch eine race-condition.
esskar
 2006-04-17 23:09
#7343 #7343
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=pq,17.04.2006, 19:11](außer der server läuft auf Win32...)[/quote]
dann müsste er aber auf Win95, Win98 oder WinME laufen, ich glaube, dass ist nicht ganz der Fall

@x-man: bei welchem provider bist du denn?
x-man
 2006-04-17 23:49
#7344 #7344
User since
2003-09-11
67 Artikel
BenutzerIn
[default_avatar]
@esskar: evanzo
<< |< 1 2 3 4 ... 7 >| >> 65 Einträge, 7 Seiten



View all threads created 2006-04-17 19:11.