Thread "open() und sysopen()" /? (14 answers)
Opened by BlackExe at 2007-08-05 00:48

Gast Gast
 2007-08-05 02:45
#97530 #97530
sysopen() buffert genauso wie open().

Ansonsten hängt es davon ab was du genau machen möchtest, und ob es sicherer ist.

Und öffnen + locking kann auch bei sysopen() nicht in einen Schritt gemacht werden. Leider verstehen da viele das Attibut O_EXCL falsch.


Und jetzt alles etwas genauer.
Zu der Sicherheit. Stell dir vor du möchtest eine Datei erstellen. Du möchtest aber keine bereits vorhandene Datei überschreiben. Du kommst also zu der Idee folgenden Code zu schreiben.

Code (perl): (dl )
1
2
3
4
if ( -e $file ) {
    die "Datei gibt es schon\n";
}
open my $fh, '>', $file  or  die $!;


Sieht im ersten Moment richtig aus. Wenn die Datei existiert brichst du ab. Ansonsten wird die Datei erstellt.

Auf den zweiten Blick sieht es etwas anderes aus. Ich denke mal du wirst ein Multitasking OS nutzen. Das Multitasking funktioniert letztendlich so das jeder Prozess für kurze Zeit ausgeführt wird, dadurch kommt es uns so vor als wenn mehrere Sachen Parallel abarbeiten.

In wirklichkeit kann aber immer nur ein "Befehl" gleichzeitig abgearbeitet werden. Und im oberen Code ist z.B. nicht sichergestellt das nach der if Überprüfung dein Programm auch noch an der Reihe ist.

Das kann zu folgendes führen. Du überprüfst ob eine Datei existiert, diese existiert nicht. Dann ist ein anderer Prozess an der Reihe, dieser erstellt jetzt auf einmal genau die Datei. Danach ist dein Programm an der Reihe und mit deinem open überschreibst du auf einmal diese Datei.

Dieser Fehler hängt also letztendlich von der Ausführungszeit ab. Deswegen nennt man soetwas auch Race Condition. Solche Fehler sind schwer zu finden.

View full thread "open() und sysopen()" /?