¿Por qué puedo cambiar el nombre de un ejecutable en ejecución, pero no eliminarlo?


12

Todo está en el título, pero más oficialmente:

¿Por qué Windows me permite cambiar el nombre de un ejecutable en ejecución, pero no eliminarlo?

Respuestas:


12

Realmente no existe el cambio de nombre de un archivo. Un archivo puede tener más de un nombre o ningún nombre, por lo que no es el archivo que está renombrando sino la entrada del directorio. El cambio de nombre es una operación en la entrada del directorio, que no se ve afectada por el hecho de que el archivo está bloqueado para su ejecución.


2
Hmm, ¿por qué falla cualquier intento de cambiar el nombre de un archivo normal que está abierto para leer o escribir?
Serge

55
@Serge: Debido a que el proceso que abrió el archivo específicamente solicitó que fallara al establecer los indicadores de apertura apropiados.
David Schwartz

¿Qué banderas abiertas específicas?
n611x007

2
Lo más probable es que se establezca dwShareModeen cero o use las banderas OF_SHARE_COMPATo OF_SHARE_EXCLUSIVE.
David Schwartz

6

No permite eliminar el archivo ejecutable y las DLL porque Windows asigna partes de los archivos ejecutables en la memoria como parte de la creación del proceso, por lo que necesita el archivo durante la vida útil del proceso.

Desafortunadamente, no tengo una verdadera razón por la que todavía permita cambiar el nombre de dichos archivos. Supongo que esto se hace para permitir la actualización de los archivos dlls y exe mientras se ejecutan para minimizar el tiempo de interrupción del servicio.

El linux (unix en general) en contraste permite eliminar un archivo ejecutable mientras se está ejecutando:

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

Tenga en cuenta que, por ejemplo, Linux también asigna partes de los archivos ejecutables a la memoria, pero no tiene ningún problema que le permita eliminar un ejecutable en ejecución.
ChrisInEdmonton

2
@ChrisInEdmonton Sí, pero esto lo expliqué aquí: unix.stackexchange.com/questions/49299/…
Serge

Serge, buena explicación allí. :)
ChrisInEdmonton

Linux no le permitirá eliminar un archivo mientras se está ejecutando. Sin embargo, puede eliminar entradas de directorio, ya que no se están ejecutando.
David Schwartz

@DavidSchwartz, consulte la actualización de mi respuesta. Linux me permite desvincular cualquier archivo que se esté ejecutando siempre que tenga permisos suficientes para eliminar ese archivo.
Serge

2

Supongo que es porque un nombre es solo un atributo del mismo contenido binario del archivo, por lo que mientras los datos estén allí, el identificador, mantenido por el proceso en ejecución, no cambiará.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.