Forums Neueste Beiträge
 

Flags beim Dateiöffnen

29/09/2013 - 20:36 von Helmut Schellong | Report spam
Hallo,

ich habe bisher bei
fd= open(pfad, flags, 0666);
erfolgreich die Flags
O_CREAT|O_WRONLY|O_RDONLY|O_RDWR|O_APPEND|O_TRUNC|O_SYNC
benutzt.
Nun habe ich mich mal mit O_SHLOCK, O_EXLOCK, O_EXCL beschàftigt,
und stellte fest, daß diese offenbar _keinen_ Effekt haben
hinsichtlich exklusivem Dateizugriff!

Wenn ich z.B. erfolgreich O_CREAT|O_EXCL|... verwende, ist
die erzeugte Datei nachfolgend vollkommen ungeschützt
für jeden beliebigen Zugriff, nur mit Ausnahme der
Wirkung der Dateirechte 0777.

Wenn ich also eine Datei in dieser Weise erzeuge und
geöffnet halte, kann ich mit anderen Prozessen die
Datei parallellàufig beliebig lesen, beschreiben, löschen, etc.

If O_EXCL is set with O_CREAT and the file already exists,
open() returns an error. This may be used to implement
a simple exclusive access locking mechanism.

Der erste Satz ist zutreffend; aber so viel kann man damit
nicht anfangen.
Der zweite Satz stimmt aufgrund meiner Versuche gar nicht!
Exklusiver Zugriff bedeutet für mich, daß andere Prozesse
in gar keiner Weise auf eine solcherweise geöffnete Datei
zugreifen können, nicht nur nicht auf den Inhalt, sondern
auch nicht auf Metadaten - zumindest nicht schreibend.

Ich schàtze, darüber wissen einige mehr als ich...



Mit freundlichen Grüßen
Helmut Schellong var@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
 

Lesen sie die antworten

#1 Michael Baeuerle
30/09/2013 - 10:46 | Warnen spam
Helmut Schellong wrote:

If O_EXCL is set with O_CREAT and the file already exists,
open() returns an error. This may be used to implement
a simple exclusive access locking mechanism.

Der erste Satz ist zutreffend; aber so viel kann man damit
nicht anfangen.



Deswegen steht da "simple [...] mechanism". Es schaut einfach nur ob die
Datei vorhanden ist oder nicht. Wenn du also zwei Prozesse hast die
beide dieses Flag verwenden (auf den gleichen Pfadnamen), dann bekommt
immer nur einer die Datei auf. Damit kann man schon was anfangen wenn
man es richtig programmiert.

Der zweite Satz stimmt aufgrund meiner Versuche gar nicht!
Exklusiver Zugriff bedeutet für mich, daß andere Prozesse
in gar keiner Weise auf eine solcherweise geöffnete Datei
zugreifen können, nicht nur nicht auf den Inhalt, sondern
auch nicht auf Metadaten - zumindest nicht schreibend.



So etwas wàre nur mit sog. "mandatory locks" möglich. Die wurden aber
nicht in POSIX aufgenommen und sind damit nicht portabel. Stattdessen
aufgenommen wurde das sog. "advisory record locking" [1], da müssen die
Prozesse aber ebenfalls zusammenarbeiten.

Einige Unix Varianten unterstützen zusàtzlich mandatory locks in nicht
portabler Weise, BSDs gehörten aber meines Wissens nicht dazu.


Micha

[1] http://pubs.opengroup.org/onlinepub...fcntl.html

Ähnliche fragen