Por que posso renomear um executável em execução, mas não excluí-lo?


12

Tudo está no título, mas mais oficialmente:

Por que o Windows permite que eu renomeie um executável em execução, mas não o exclua?

Respostas:


12

Realmente não existe o nome de renomear um arquivo. Um arquivo pode ter mais de um nome ou nenhum nome; portanto, não é o arquivo que você está renomeando, mas a entrada do diretório. Renomear é uma operação na entrada do diretório, que não é afetada pelo fato de o arquivo estar bloqueado para execução.


2
Hmm, por que, então, qualquer tentativa de renomear um arquivo comum aberto para leitura ou gravação falha?
Serge

5
@ Emerge: porque o processo que abriu o arquivo pediu especificamente para que falhasse, definindo os sinalizadores abertos apropriados.
21712 David Schwartz

que bandeiras abertas específicas?
N611x007

2
Muito provavelmente, definindo dwShareModecomo zero ou usando os sinalizadores OF_SHARE_COMPATou OF_SHARE_EXCLUSIVE.
David Schwartz

6

Ele não permite excluir o arquivo executável e as DLLs porque o Windows mapeia partes dos arquivos executáveis ​​na memória como parte da criação do processo; portanto, ele precisa do arquivo durante a vida útil do processo.

Infelizmente, não tenho uma verdadeira razão pela qual ele ainda permite renomear esses arquivos. Eu acho que isso é feito para permitir a atualização das DLLs e arquivos exe enquanto eles estão em execução para minimizar o tempo de interrupção do serviço.

O linux (unix em geral) em contraste permite excluir um arquivo executável enquanto está em execução:

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

Observe que, por exemplo, o Linux também mapeia partes dos arquivos executáveis ​​na memória, mas não tem nenhum problema em permitir que você exclua um executável em execução.
22412 ChrisInEdmonton

2
@ChrisInEdmonton Sim, mas isso eu expliquei aqui: unix.stackexchange.com/questions/49299/...
Serge

Serge, boa explicação lá. :)
ChrisInEdmonton

O Linux não permitirá que você exclua um arquivo enquanto estiver em execução. No entanto, você pode remover as entradas do diretório, pois elas não estão em execução.
21712 David Schwartz

@DavidSchwartz, consulte a atualização para minha resposta. O Linux me permite desvincular qualquer arquivo que está sendo executado, desde que eu tenha permissões suficientes para excluir esse arquivo.
Serge

2

Eu acho que é porque um nome é apenas um atributo do mesmo conteúdo binário do arquivo, portanto, enquanto os dados estiverem lá, o identificador, mantido pelo processo em execução, não será alterado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.