1 2 3 4 5 6
my $start = time; my $flock = flock (FH,LOCK_EX|LOCK_NB); while (!$flock && time-$start < 3) { sleep 1; $flock = flock (FH,LOCK_EX|LOCK_NB); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/env perl use Fcntl ':flock'; use strict; use warnings; open DATEI, '+<', 'counter.txt' or die "Konnte die Datei nicht öffnen: $!"; flock DATEI, LOCK_EX or die "Sperren der Datei fehlgeschlagen: $!"; my $aktuellerZaehler = int (<DATEI>); $aktuellerZaehler += 1; seek DATEI, 0, 0; truncate DATEI, 0; print DATEI "$aktuellerZaehler"; close DATEI;
2012-06-06T10:13:02 pqich würde noch die argumente für seek importieren:
QuoteThe values for WHENCE are 0 to set the
new position *in bytes* to POSITION, 1 to set it to the current
position plus POSITION, and 2 to set it to EOF plus POSITION
(typically negative). For WHENCE you may use the constants
"SEEK_SET", "SEEK_CUR", and "SEEK_END" (start of the file,
current position, end of the file) from the Fcntl module.
Returns 1 upon success, 0 otherwise.
2012-06-06T10:52:40 biancaWorin liegt der Unterschied, ob ich dort eine 0 oder ein SEEK_SET angebe?
2012-06-06T10:52:40 biancaGut, dass das hier angesprochen wird, ich habe das nämlich noch nie so ganz verstanden und lasse deshalb den dritten Parameter immer weg.
1
2
3
$ perl -wE'seek STDIN, 0;'
Not enough arguments for seek at -e line 1, near "0;"
Execution of -e aborted due to compilation errors.
2012-06-06T11:06:40 Johannes_SchullerZwecks lexikalischer Filehandles ist es bei uns so, daß wir diese eigentlich zur Konverterarbeit generell nicht benutzen bzw. auch use strict etc. nicht.
2012-06-06T10:05:47 pqich würde einfach alarm() benutzen, wenn ich nach einer bestimmten wartezeit abbrechen will.
2012-06-06T10:47:18 bianca2012-06-06T10:05:47 pqich würde einfach alarm() benutzen, wenn ich nach einer bestimmten wartezeit abbrechen will.
Verliere ich bei alarm() nicht die Kontrolle?
Ich mach das immer so, damit ich danach noch eine qualifizierte Fehlermeldung an den Client senden kann, wenn das Script nach 3 Sekunden nicht dran kam.
2012-06-06T10:58:34 pqinwiefern verlierst du denn die kontrolle? du fragst ja bei einem alarm() innerhalb eines eval danach dann die fehlermeldung in $@ ab und reagierst dann entsprechend. verstehe nicht, wieso das kontrollverlust für dich bedeutet.
2012-06-06T13:25:36 biancaIch dachte, bei alarm() wird immer ein die() ausgelöst und das script ist raus.
2012-06-06T15:56:36 pqein beispiel mit eval und signal-handler steht ja auch in perldoc -f alarm
alarm 0; # Schutz vor Race Condition
QuoteDas zweite alarm 0 ist für den Fall vorgesehen, dass das Signal nach der Ausführung von flock, aber vor dem ersten alarm 0 eintrifft. Ohne den zweiten alarm 0 würden Sie eine kleine Race Condition riskieren - aber die Größe spielt bei Race Conditions keine Rolle, sie existieren oder sie existieren nicht.
QuoteUsing eval/die always works, modulo the caveats given in Signals in the perlipc manpage.
.....
For more information see the perlipc manpage.