Thread open-Anweisung (22 answers)
Opened by geloescht at 2012-06-24 00:30

geloescht
 2012-06-24 00:30
#159326 #159326
User since
2012-06-19
141 Artikel
BenutzerIn
[default_avatar]
Abend Leute

Ich habe hier einen kleinen Code-Block:

Code: (dl )
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);


Hier baue ich mir eine fortlaufende Nummerierung, beginnend mit 1000 in der Datei counter.csv (Damit habe ich mir das Problem der "führenden Nullen" erspart!)

1. Erstaunlicher weise liest dieser Code die alte Nummer ein, und schreibt diese um einen Wert erhöht zurück. Ich hatte schon befürchtet, daß er alle neuen Nummern untereinander in die Datei schreibt. Was er nicht tut. Er löscht, bzw. überschreibt die alte counter-Zahl mit dem neuen Wert. Dies ist auch so von mir gewollt (Glück gehabt!)

2. Wie man im Code erkennen kann, öffnet dieser zuerst die counter.csv um den Wert bsp. 1000 auszulesen und schließt sie dann. Danach öffnet der Code die Datei erneut zum zurückschreiben des neuen Wertes (bsp.1001).

Das funktioniert im "Single"-Betrieb ganz gut. Würde aber im "Multi"-Betrieb (mehrere User) ein kleines Zeitfenster öffnen, in dem ein anderer Client die counter.csv öffnen könnte, noch bevor der neue Wert zurückgeschrieben wurde (nennt sich Race-Condition). Gibt es keine Möglichkeit, die Datei counter.csv geöffnet zu halten, um den Wert 1000 auszulesen, mit eins zu addieren und zurück zu schreiben. Und erst am Schluß der Aktion die Datei zu schliessen?

Gruß HP-User
Last edited: 2012-06-24 00:41:31 +0200 (CEST)
Past brought us "SYS 64738". Present brought us "ctrl+alt+del". But what will future bring?

View full thread open-Anweisung