Thread "open() und sysopen()" /?
(14 answers)
Opened by BlackExe at 2007-08-05 00:48
Fortsetzung vom vorherigen Beitrag... Teil 3 of 4
Der Schlüssel ist es den Dateitest auf den Filehandle zu erledigen, und nicht auf den Filenamen. Der Filename kann sich jederzeit ändern. Ein anderer Prozess kann dazwischen kommen, die Datei löschen, etwas anderes erzeugen etc. Wenn du allerdiengs bereits die Datei einmal geöffnet hast, dann hast du einen Filediskiptor der auf die Datei zeigt. Die Datei kann jetzt verschoben werden, sogar gelöscht werden oder andere Sachen mit ihr passieren. Dein Dateidiskriptor wird weiterhin immer auf die selbe datei zeigen. Daher überprüft "-l $fh" auch wirklich deine geöffnete Datei, auch wenn vielleicht die Datei in wirklichkeit schon verschoben wurde, oder jetzt an einem anderen Ort liegt. Ansonsten wenn du Dateitests immer auf Filehandles erledigst gibt es da keine Probleme. Wenn du eine Datei erstellen möchtest allerdiengs keine Datei überschreiben möchtest dann musst du sysopen() in verbindung mit den Optionen O_CREAT | O_EXCL nutzen, dass ist die einzige Option die auch sicher vor Race Conditions ist. Ansonst beim reinen öffnen (lesend) einer Datei ist es volkommen egal ob du nun open() oder sysopen() nutzt. Auch die Aussage sysopen() an sich wäre sicherer stimmt so auch nicht. Weiterhin kannst du eine Datei auch beliebig gemischt mit sysopen() und open() öffnen, sofern das überhaupt einen Sinn ergibt. Ansonsten unabhängig davon kann sysopen() halt noch paar Sachen die open() nicht kann. das meiste hängt halt zusammen mit den gleichzeitigen erzeugen, oder das eine Datei nicht vorhanden sein darf. Mit O_EXCL als Modus darf eine Datei nicht vorhanden sein, und wenn du nicht O_CREAT angibst, dann wird eine Datei auch nicht erzeugt wenn sie nicht existieren sollte. So kannst du eine Datei erweitern, aber nur dann wenn sie schon existiert und paar andere Feinheiten. Ob du diese Feinheiten benötigst hängt von deinem Programm ab was du schreibst. Fortsetzung im nächsten Beitrag... Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
|