Christian Seiler: Neuer Artikel: Sperren von Dateien

Beitrag lesen

Hallo Martin,

(und ich auch gerade nicht auswendig weiß, was da bei Netzwerkdateisystemen passiert, wenn unterschiedliche Rechner das machen wollen).

Nichts. Jedenfalls aus der Sicht des Windows-Rechners. Bei Netzwerkvolumes überlässt Windows das Locking komplett dem Host, dem das Dateisystem gehört. Ist das bei den anderen nicht auch so? Kann ein Linux-Host von sich aus eine Datei für den Zugriff sperren, die auf einem anderen Host liegt? Oder macht das nicht in Wirklichkeit auch der Server, der die Datei zur Verfügung stellt?

Ich verstehe nicht ganz, was Du jetzt wie meinst.

Folgende Situation (egal ob jetzt Linux oder Windows und ob jetzt SMB oder NFS): Rechner A ist der "Server", Rechner B und C sind die "Clients" (im SMB/NFS-Sinn). Sprich: Rechner A gibt irgend ein Verzeichnis frei, das auf Rechnern B und C eingebunden ist.

Nun sperrt ein Programm auf Rechner B eine Datei, die eigentlich auf Rechner A liegt. Was passiert, wenn ein Programm auf Rechner C nun die selbe Datei sperren will?

Im folgenden werde ich folgende Begriffe nutzen:

"Funktioniert" == Rechner C muss warten
 "Funktionier nicht" == Rechner C denkt, er habe die Datei gesperrt
                        (d.h. die Sperren sind unabhängig voneinander nur
                        auf den jeweiligen Rechnern vorhanden und daher
                        kann es zu Konflikten Kommen)
 "Fehler" == auf Rechner C tritt eine Fehlermeldung auf

[Den Fall, in denen gar keine Rechner überhaupt Dateien sperren können, weil Funktionalität deaktiviert oder ähnliches, betrachte ich hier mal nicht.]

Was passiert nun?

* Windows/LockFileEx: "Funktioniert"
 * Linux/flock(2) (und vmtl. auch FreeBSD/flock(2) und MacOSX/flock(2):
   "Funktioniert nicht"
 * Linux/fcntl(2) (und vmtl. auch FreeBSD/fcntl(2) und MacOSX/fcntl(2):
   "Funktioniert"

Meine Klammer bezog sich nun darauf, dass ich weder recherchiert noch getestet habe, was unter Windows mit den Share-Modes passiert, wenn diese über das Netzwerk verwendet werden. Wäre also nett, wenn Du sagen kannst, in welchen der drei obigen Fälle folgendes Szenario passt:

Rechner A, B und C sind Windows-Rechner (2000, 2003 oder XP z.B.). Auf Rechner B öffnet ein Prozess eine Datei auf Rechner A mit ShareMode == "ich teile gar nichts" und kurz darauf während die Datei noch offen ist versucht ein Prozess auf Rechner C die selbe Datei auch mit ShareMode == "ich teile gar nichts" zu öffnen. Was passiert hier?

Zudem: Ich denke jeder, der ernsthaft einen Windows-Server betreibt, hat heutzutage NTFS

Da hast du wahrscheinlich Recht, aber die Problematik des File-Lockings besteht ja nicht nur in Server-Umgebungen, sondern auch bei lokalen Anwendungen, die konkurrierend auf dieselbe Datei zugreifen wollen (oder sogar konkurrierende Threads innerhalb einer Anwendung). Daher ist das Thema sogar für die Nur-Windows-Programmierer interessant.

Ja klar. Nur wenn das meine Zielgruppe gewesen wäre, dann hätte ich einen Abschnitt über C hinzugefügt, der die Windows-API-Funktion selbst erläutert. ;-) Und dann hätte ich CreateFile auch besprochen - und die damit verbundenen ShareModes.

Viele Grüße,
Christian