Perché posso rinominare un eseguibile in esecuzione, ma non eliminarlo?


12

Tutto è nel titolo, ma più ufficialmente:

Perché Windows mi consente di rinominare un eseguibile in esecuzione, ma non di eliminarlo?

Risposte:


12

Non c'è davvero nulla come rinominare un file. Un file può avere più di un nome o nessun nome, quindi non è il file che stai rinominando ma la voce della directory. La ridenominazione è un'operazione sulla voce della directory, che non è influenzata dal fatto che il file è bloccato per l'esecuzione.


2
Hmm, perché allora ogni tentativo di rinominare un normale file aperto per la lettura o la scrittura fallisce?
Serge,

5
@Serge: Perché il processo che ha aperto il file ha richiesto che fallisse impostando i flag aperti appropriati.
David Schwartz,

quali bandiere aperte specifiche?
n611x007,

2
Molto probabilmente, impostando dwShareModesu zero o usando i flag OF_SHARE_COMPATo OF_SHARE_EXCLUSIVE.
David Schwartz,

6

Non consente di eliminare il file eseguibile e le DLL poiché Windows mappa le parti dei file eseguibili in memoria durante la creazione del processo, pertanto è necessario il file durante la durata del processo.

Sfortunatamente non ho una vera ragione per cui permetta ancora di rinominare tali file. Immagino che ciò avvenga per consentire l'aggiornamento dei file dlls ed exe mentre sono in esecuzione per ridurre al minimo i tempi di interruzione del servizio.

Il linux (unix in generale) al contrario consente di eliminare un file eseguibile mentre è in esecuzione:

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

Si noti che, ad esempio, Linux mappa anche parti dei file eseguibili in memoria, ma non ha alcun problema che consente di eliminare un eseguibile in esecuzione.
ChrisInEdmonton,

2
@ChrisInEdmonton Sì, ma questo l'ho spiegato qui: unix.stackexchange.com/questions/49299/…
Serge

Serge, bella spiegazione lì. :)
ChrisInEdmonton,

Linux non ti consentirà di eliminare un file mentre è in esecuzione. È possibile, tuttavia, rimuovere le voci della directory, poiché non sono in esecuzione.
David Schwartz,

@DavidSchwartz vedi l'aggiornamento alla mia risposta. Linux mi consente di scollegare qualsiasi file in esecuzione a condizione che disponga delle autorizzazioni sufficienti per eliminare quel file.
Serge,

2

Immagino che sia perché un nome è solo un attributo dello stesso contenuto binario del file, quindi finché i dati sono lì, l'handle, trattenuto dal processo in esecuzione perché non cambierà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.