Pourquoi puis-je renommer un exécutable en cours d'exécution sans le supprimer?

10

Tout est dans le titre, mais plus officiellement:

Pourquoi Windows me permet-il de renommer un exécutable en cours d'exécution sans le supprimer?

marco-fiset
la source

Réponses:

9

Il n’existe vraiment pas de renommer un fichier. Un fichier peut avoir plus d'un nom ou aucun nom. Ce n'est donc pas le fichier que vous renommez, mais l'entrée du répertoire. Renommer est une opération sur l'entrée de répertoire, qui n'est pas affectée par le fait que le fichier est verrouillé pour exécution.

David Schwartz
la source
1
Hmm, pourquoi alors toute tentative de renommer un fichier normal ouvert en lecture ou en écriture échoue?
Serge
4
@Serge: Parce que le processus qui a ouvert le fichier a spécifiquement demandé son échec en définissant les indicateurs d'ouverture appropriés.
David Schwartz
quels drapeaux ouverts spécifiques?
n611x007
2
Très probablement, mettre dwShareModeà zéro ou utiliser les indicateurs OF_SHARE_COMPATou OF_SHARE_EXCLUSIVE.
David Schwartz
5

Il ne permet pas de supprimer le fichier exécutable et les DLL, car Windows mappe des parties des fichiers exécutables en mémoire dans le cadre de la création du processus. Il a donc besoin du fichier pendant toute la durée du processus.

Malheureusement, je n'ai pas de vraie raison pour laquelle il est toujours possible de renommer de tels fichiers. Je suppose que cela est fait pour activer la mise à jour des dll et des fichiers exe pendant leur exécution afin de minimiser le temps d'interruption du service.

Le linux (unix en général) permet en revanche de supprimer un fichier exécutable en cours d’exécution:

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
la source
Notez que, par exemple, Linux mappe également des parties des fichiers exécutables en mémoire, mais n’a aucun problème pour vous permettre de supprimer un exécutable en cours d’exécution.
ChrisInEdmonton
2
@ChrisInEdmonton Oui, mais je l' ai expliqué ici: unix.stackexchange.com/questions/49299/...
Serge
Serge, belle explication là. :)
ChrisInEdmonton
Linux ne vous autorisera pas à supprimer un fichier pendant son exécution. Vous pouvez cependant supprimer des entrées de répertoire, car celles-ci ne sont pas en cours d'exécution.
David Schwartz
@ DavidSchwartz s'il vous plaît voir la mise à jour de ma réponse. Linux me permet de dissocier tout fichier en cours d'exécution, à condition que je dispose des autorisations suffisantes pour supprimer ce fichier.
Serge
2

J'imagine que c'est parce qu'un nom est juste un attribut du même contenu binaire du fichier, aussi longtemps que les données sont là, le descripteur, conservé par le processus en cours d'exécution, ne changera pas.

ppeterka
la source