Dlaczego mogę zmienić nazwę działającego pliku wykonywalnego, ale go nie usuwać?

12

Wszystko jest w tytule, ale bardziej oficjalnie:

Dlaczego system Windows pozwala mi zmienić nazwę działającego pliku wykonywalnego, ale nie mogę go usunąć?

marco-fiset
źródło

Odpowiedzi:

12

Naprawdę nie ma czegoś takiego jak zmiana nazwy pliku. Plik może mieć więcej niż jedną nazwę lub może nie mieć żadnej nazwy, więc nie zmieniasz nazwy pliku, ale pozycję katalogu. Zmiana nazwy jest operacją na wpisie katalogu, na którą nie ma wpływu fakt, że plik jest zablokowany do wykonania.

David Schwartz
źródło
2
Hmm, dlaczego więc jakakolwiek próba zmiany nazwy zwykłego pliku, który jest otwarty do odczytu lub zapisu, kończy się niepowodzeniem?
Serge
5
@Serge: Ponieważ proces, który otworzył plik, poprosił go o awarię, ustawiając odpowiednie otwarte flagi.
David Schwartz
jakie konkretne otwarte flagi?
n611x007,
2
Najprawdopodobniej ustawienie dwShareModena zero lub użycie flag OF_SHARE_COMPATlub OF_SHARE_EXCLUSIVE.
David Schwartz
6

Nie pozwala na usunięcie pliku wykonywalnego i bibliotek DLL, ponieważ system Windows mapuje części plików wykonywalnych do pamięci w ramach procesu tworzenia, dlatego potrzebuje pliku przez cały czas jego trwania.

Niestety nie mam prawdziwego powodu, dla którego nadal pozwala zmieniać nazwy takich plików. Myślę, że jest to zrobione, aby umożliwić aktualizację plików dll i exe podczas ich działania, aby zminimalizować czas przerwy w działaniu usługi.

Natomiast linux (ogólnie unix) pozwala na usunięcie pliku wykonywalnego podczas jego działania:

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
Serge
źródło
Zauważ, że np. Linux mapuje również części plików wykonywalnych do pamięci, ale nie ma problemu z usunięciem działającego pliku wykonywalnego.
ChrisInEdmonton,
2
@ChrisInEdmonton Tak, ale wyjaśniłem to tutaj: unix.stackexchange.com/questions/49299/…
Serge
Serge, fajne wyjaśnienie. :)
ChrisInEdmonton,
Linux nie pozwoli ci usunąć pliku podczas jego wykonywania. Można jednak usunąć wpisy katalogu, ponieważ nie są one wykonywane.
David Schwartz
@DavidSchwartz proszę zobaczyć aktualizację mojej odpowiedzi. Linux pozwala mi odłączyć dowolny wykonywany plik, pod warunkiem, że mam wystarczające uprawnienia do usunięcia tego pliku.
Serge
2

Myślę, że dzieje się tak, ponieważ nazwa jest tylko atrybutem tej samej binarnej zawartości pliku, więc dopóki dane tam są, uchwyt trzymany przez uruchomiony proces nie zmieni się.

ppeterka
źródło