Moin,
Und welcher Prozess achtet jetzt darauf, wann Datei 1 gelöscht werden kann?
Die Antwort ist einfach: Auf modernen Betriebssystemen sind Namen und Dateien zwei völlig verschiedene Dinge. Dateien werden über Inodes (o.ä.) angesprochen, die Namen stehen nur in einem Verzeichnis und bilden Zeiger auf die Inodes. So kann eine Datei auch beliebig viele Namen haben (Hard links).
Die andere Sache ist die, dass beim Öffnen einer Datei einmal der Name vom Prozess angegeben wird, vom Betriebssystem kriegt er dann ein Filehandle, eine Nummer. Die Datei wird danach nur noch über die Nummer angesprochen. (_Eigentlich_ gibt es nichtmal mehr eine Möglichkeit vom Handle auf den Namen zu schließen der mit der Datei verknüpft ist.) Der Name ist für eine offene Datei vollkommen unerheblich. Du kannst mit ihm machen was du willst: du kannst ihn umbenennen, und sogar löschen.
In den Datenstrukturen der Datei wird dabei ein Referenzzähler geführt, der angibt wieviele Namen noch auf diese Datei zeigen. Und sobald der Zähler auf Null geht (und die Datei geschlossen ist) wird der von ihr belegte Speicherplatz wieder freigegeben.
Das ganze läuft also so ab: Prozess A öffnet die Datei über einen Namen X, kriegt ein Handle. Er liest dann mit diesem Handle aus der Datei. Der Name ist jetzt nicht mehr von Bedeutung. Prozess B lädt eine Datei hoch und nennt sie Y. Wenn er fertig ist löscht er den alten Namen X - der Referenzzähler geht auf Null, aber die Datei ist ja noch offen - und legt für Y einen neuen Namen an, er nennt sie X. Y kann jetzt gelöscht werden, der Referenzzähler bleibt auf 1. Prozess B ist jetzt fertig, und Prozess A kann immer noch lustig aus seinem Handle lesen. Sobald er fertig ist schliesst er die Datei und das Betriebssystem gibt den Speicherplatz frei.
Der interessante Prozess - das Löschen von X und anschließende Umbenennen von Y nach X - geschieht atomar: Das heisst, es gibt keinen Augenblick indem X nicht mehr existiert und Y noch nicht umbenannt wurde. Ein Prozess der direkt davor X öffnet kriegt noch ein Handle auf die alte Datei, direkt danach würde er ein Handle auf die neue Datei kriegen.
PS: Das alles ist jetzt prinzipiell und "so sollte es sein". Mir ist durchaus bewusst dass Windows zum Beispiel künstliche Einschränkungen hat die es nicht erlauben eine Datei umzubenennen während sie noch geöffnet ist.
Henryk Plötz
Grüße aus Berlin
~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~