1
2
3
open(APPENDFILE,">>$zufallnr.txt");
print APPENDFILE ("$zufallnr, ", "$derVorname"," ", "$derNachname, ", "$mailto","\n");
close (APPENDFILE);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
print $query->hidden(-name=>'test',
-default=>'');
my $testNr = $query->param('test');
my $status = open (READFILE,"<$testNr.txt");
my $zeile = <READFILE>;
my @zeile = $zeile;
my @empfaenger = split(/,/,$zeile);
my $derName = $empfaenger[1];
if (!$status){
print "Fehler"
} else {
my @umbenennen = $zeile;
open(APPENDFILE,">>newsletter.txt");
print APPENDFILE "@umbenennen";
close (APPENDFILE);
close(READFILE);
unlink ("$testNr.txt");
print "Hallo $derName, vielen Dank für die Newsletter-Bestellung!";
}
2011-07-11T09:50:30 OlliOh, danke für den Hinweis. Man muß wohl immer mit dem bösen Willen der Menschen rechnen?
2011-07-11T09:50:30 OlliAllerdings, wenn ich der Datei statt newsletter.txt einen ganz absurden Namen gebe, dann ist die Gefahr eher gering, oder? Ist ja auch nirgends ersichtlich wie ich die Datei nenne.
use Fcntl ':flock';
1
2
3
4
5
6
open(APPENDFILE,">>newsletter.txt");
flock(APPENDFILE, LOCK_SH);
print APPENDFILE "@umbenennen";
close (APPENDFILE);
flock(APPENDFILE, LOCK_UN);
close(READFILE);
1
2
3
4
5
open(APPENDFILE,">>newsletter.txt");
flock(APPENDFILE, LOCK_EX);
print APPENDFILE "@umbenennen";
close (APPENDFILE);
close(READFILE);
2011-07-12T17:40:43 rostiJeder Prozess, der lesender und schreibender Weise zugreift, braucht eine gewisse Zeitspanne. Mit einem LOCK_EX kann innerhalb dieser Zeitspanne kein anderer Prozess nichts tun, auch nicht Lesen, das ist wichtig.
Somit kann ein weiterer Prozess erst Lesen, wenn er selbst den Zugriff bekommt und es ist damit sichergestellt, dass der Nächste, der das Handle bekommt, den letzten aktuellen Datenbestand im Kasten hat.
In Deinem Fall würde es evntl. genügen, nur den Schreibzugriff zu locken, weil die Daten nur angehängt werden (was vordem steht ist uninteressant). Mach ein LOCK_EX und alles wird gut ;)