Warum kann ich eine laufende ausführbare Datei umbenennen, aber nicht löschen?


12

Alles ist im Titel, aber offizieller:

Warum kann ich unter Windows eine laufende ausführbare Datei umbenennen, aber nicht löschen?

Antworten:


12

Es gibt wirklich kein Umbenennen einer Datei. Eine Datei kann mehr als einen Namen oder keinen Namen haben. Es handelt sich also nicht um die Datei, die Sie umbenennen, sondern um den Verzeichniseintrag. Das Umbenennen ist eine Operation für den Verzeichniseintrag, die nicht davon betroffen ist, dass die Datei für die Ausführung gesperrt ist.


2
Hmm, warum schlägt dann jeder Versuch fehl, eine reguläre Datei umzubenennen, die zum Lesen oder Schreiben geöffnet ist?
Serge

5
@Serge: Da der Prozess, der die Datei geöffnet hat, speziell zum Fehlschlagen aufgefordert hat, indem die entsprechenden offenen Flags gesetzt wurden.
David Schwartz

Welche spezifischen offenen Flaggen?
n611x007

2
Höchstwahrscheinlich dwShareModeauf Null setzen oder die Flags OF_SHARE_COMPAToder verwenden OF_SHARE_EXCLUSIVE.
David Schwartz

6

Das Ausführen der ausführbaren Datei und der DLLs ist nicht möglich, da Windows Teile der ausführbaren Dateien im Rahmen der Prozesserstellung dem Speicher zuordnet und die Datei daher während der Lebensdauer des Prozesses benötigt.

Leider habe ich keinen wahren Grund, warum es immer noch erlaubt ist, solche Dateien umzubenennen. Ich vermute, dass dies getan wird, um die Aktualisierung der DLLs und Exe-Dateien zu ermöglichen, während sie ausgeführt werden, um die Dienstunterbrechungszeit zu minimieren.

Im Gegensatz dazu ermöglicht Linux (Unix im Allgemeinen) das Löschen einer ausführbaren Datei, während sie ausgeführt wird:

tmp]$ cp /usr/bin/md5sum .;ll md5*; \
(./md5sum /home/pub/iso/FC5/FC-5-i386-DVD.iso & ); \
rm md5sum ; ll md5*;ps -f
-rwxr-xr-x 1 sergey sergey 37276 Oct 16 02:38 md5sum
ls: cannot access md5*: No such file or directory
UID        PID  PPID  C STIME TTY          TIME CMD
sergey    2423  2422  0 02:32 pts/1    00:00:00 -bash
sergey    2533     1  0 02:38 pts/1    00:00:00 ./md5sum /home/pub/iso/FC5/FC-5-
sergey    2536  2423  0 02:38 pts/1    00:00:00 ps -f

Beachten Sie, dass beispielsweise Linux auch Teile der ausführbaren Dateien in den Speicher abbildet, Sie jedoch problemlos eine laufende ausführbare Datei löschen können.
ChrisInEdmonton

2
@ChrisInEdmonton Ja, aber das habe ich hier erklärt: unix.stackexchange.com/questions/49299/…
Serge

Serge, nette Erklärung da. :)
ChrisInEdmonton

Unter Linux können Sie eine Datei während der Ausführung nicht löschen. Sie können jedoch Verzeichniseinträge entfernen, da diese nicht ausgeführt werden.
David Schwartz

@ DavidSchwartz siehe das Update zu meiner Antwort. Unter Linux kann ich die Verknüpfung aller ausgeführten Dateien aufheben, sofern ich über ausreichende Berechtigungen zum Löschen dieser Datei verfüge.
Serge

2

Ich denke, das liegt daran, dass ein Name nur ein Attribut des gleichen binären Inhalts der Datei ist. Solange die Daten vorhanden sind, ändert sich das Handle, das vom laufenden Prozess dafür gehalten wird, nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.