1
2
3
4
5
6
7
8
9
10
11
12
13
14
#############################################
# File-Name-Generator (FNG) / Dateinamenbau #
#############################################
open(FILECOUNTER, "<coresys/counter.csv");
flock(FILECOUNTER, LOCK_EX);
my $oldcounter = <FILECOUNTER>;
my $newcounter = $oldcounter+1;
close(FILECOUNTER);
open(FILECOUNTER, ">coresys/counter.csv");
flock(FILECOUNTER, LOCK_EX);
print FILECOUNTER $newcounter;
close(FILECOUNTER);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
my $counter_file='counter.txt' my $cnt=read_counter($counter_file); # wenn das lesen nicht erfolgreich war # wird von read_counter "undef" in $cnt geschrieben # wenn man das testet, # kann man heraus finden, # ob das lesen erfolgreich war. # die Fehlermeldung der letzten Dateiaktion # steht in der Spezialvariable: "$!" die("Konnte Zähler nicht lesen $!\n") unless( defined ( $cnt ) ); print "COUNTER: $cnt\n"; $cnt=incement_counter($counter_file); die("Konnte Zähler nicht lesen $!\n") unless( defined ( $cnt ) ); print "COUNTER: $cnt\n";
1
2
3
4
5
6
7
8
9
10
11
#############################################
# File-Name-Generator (FNG) / Dateinamenbau #
#############################################
open(FILECOUNTER, "+<coresys/counter.csv");
flock(FILECOUNTER, LOCK_EX);
my $oldcounter = <FILECOUNTER>;
my $newcounter = $oldcounter+1;
seek(FILECOUNTER, 0, 0 );
print FILECOUNTER $newcounter;
close(FILECOUNTER);
1 2 3
open(my $fh, '<', $datei) or die "ERROR open $datei ($!)\n"; my @data=<$fh>; close($fh);
2012-06-24T11:12:05 ?bei einem Wert:1111
und einem Schreibwert:22
könnte: 2211 herauskommen? Da er nur zweistellig ist?
QuoteTrotzdem finde ich persönlich diese "alte" schreibweise von Perl schöner/übersichtlicher.
open(FILECOUNTER, "+<coresys/counter.csv") or die;
2012-06-24T18:48:04 ?Weiß man da was genaueres?
1
2
3
4
5
6
7
8
9
10
11
12
13
#############################################
# File-Name-Generator (FNG) / Dateinamenbau #
#############################################
open(FILECOUNTER, "+<coresys/counter.csv");
flock(FILECOUNTER, LOCK_EX);
my $oldcounter = <FILECOUNTER>;
my $newcounter = $oldcounter+1;
truncate(FILECOUNTER, 0);
seek(FILECOUNTER, 0, 0);
print FILECOUNTER $newcounter;
close(FILECOUNTER);
my $clientfile = "clientfile_".$newcounter.".csv";
2012-06-24T19:28:20 ?Wenn hier in der ersten Zeile (open) ein "or die" hinkäme, was würde es bewirken, bzw. ab wann würde das "or die" zum Tragen kommen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
my $success = 0; my $tries = 0; while ($success = open(FILECOUNTER, "+<coresys/counter.csv")) { last if $success # open hat funktioniert or ++$tries > 5; # mehr als 5 Versuche sleep(1); # warte etwas } if ($success) { flock(FILECOUNTER, LOCK_EX); my $oldcounter = <FILECOUNTER>; my $newcounter = $oldcounter+1; # etc. } else { # gib eine Warnung aus, oder mach was anderes }
2012-06-24T20:42:00 ?Bei Nutzung von flock (LOOK_EX), wird die geöffnete Datei für andere gesperrt.
Öffnet nun ein zweites Perlscript die gleiche Datei mit flock (LOOK_EX), wartet dieses bis die benötigte Datei wieder frei ist - oder hab ich das jetzt falsch im Kopf?
use Fcntl ':flock';
open(FILECOUNTER, "+<coresys/counter.csv");
flock(FILECOUNTER, LOCK_EX);
open(FILECOUNTER, "+<coresys/counter.csv") or die "ERROR: Unable to open the CDKG-file!";
QuoteWenn das dort so richtig ist, wozu soll ich dann noch die flock auswerten?
Quoteflock() ... Returns true for success, false on failure.
2012-06-25T18:37:09 ?Code: (dl )use Fcntl ':flock';
Das kommt in den Kopf des Programms und sagt dem Perl, das es in diesem Code mit "flock" zu rechnen hat (mal grob formuliert).
2012-06-25T18:37:09 ?Wenn open gefordert wird, und die Datei läßt sich öffnen, gibt es keine Probleme. Wenn open gefordert wird, und die Datei ist bereits offen, was passiert dann? (Alles noch ohne flock!). Normal eine Fehlermeldung (sinngemäß: cannot open file?)
2012-06-25T18:37:09 ?Müsste dann das flock nicht noch vor(!) der open-Anweisung stehen, wenn die Datei frei ist (Vorabprüfung), um andere Zugriffe noch vor der Öffnung zu reservieren?
1
2
3
4
5
/bestimmter/pfad/zu/0001_inhalt.csv
/bestimmter/pfad/zu/0002_inhalt.csv
/bestimmter/pfad/zu/0003_inhalt.csv
/bestimmter/pfad/zu/0010_inhalt.csv
/bestimmter/pfad/zu/0142_inhalt.csv
1 2 3 4 5 6
$fh->open($file, O_RDWR) or die $!; flock $fh, LOCK_EX; # Nummer lesen # Wert erhöhen # Truncate und Zurückschreiben $fh->close; # Buffer werden geleert, Datei wird geschlossen
1
2
3
4
5
6
7
8
9
10
11
12
13
############################################################
# Client-Data-Key-Generator (CDKG) / Datensatzschlüsselbau #
############################################################
open(FILECOUNTER, "+<coresys/counter.csv");
flock(FILECOUNTER, LOCK_EX);
my $oldcounter = <FILECOUNTER>;
my $newcounter = $oldcounter+1;
truncate(FILECOUNTER, 0);
seek(FILECOUNTER, 0, 0);
print FILECOUNTER $newcounter;
close(FILECOUNTER);
my $clientdatakey = "clientdatakey_".$newcounter;