Linux elimina un file in modo completamente diverso rispetto a Windows. Innanzitutto, una breve spiegazione su come vengono gestiti i file nei file system nativi * unix.
Il file viene mantenuto sul disco nella struttura multilivello chiamata i-node
. Ogni i-node ha un numero univoco sul singolo filesystem. La struttura i-node mantiene diverse informazioni su un file, come la sua dimensione, i blocchi di dati allocati per il file ecc., Ma per questa risposta l'elemento di dati più importante è a link counter
. Il directories
sono i file che mantengono record sui file. Ogni record ha il numero i-node a cui fa riferimento, la lunghezza del nome file e il nome file stesso. Questo schema consente di avere "puntatori", cioè "collegamenti" allo stesso file in luoghi diversi con nomi diversi. Il contatore dei collegamenti dell'i-node mantiene effettivamente il numero di collegamenti che fanno riferimento a questo i-node.
Cosa succede quando un processo apre il file? Innanzitutto la open()
funzione cerca il record del file. Quindi controlla se la struttura i-node in memoria per questo i-node esiste già. Questo può accadere se alcune applicazioni avevano già aperto questo file. Altrimenti, il sistema inizializza una nuova struttura i-node in memoria. Quindi il sistema aumenta il contatore aperto della struttura i-node in memoria e restituisce all'applicazione il suo descrittore di file.
Viene chiamata la chiamata alla libreria Linux per eliminare un file unlink
. Questa funzione rimuove il record del file da una directory e diminuisce il contatore dei collegamenti dell'i-nodo. Se il sistema ha rilevato l'esistenza di una struttura i-node in memoria e il suo contatore aperto non è zero, questa chiamata restituisce il controllo all'applicazione. Altrimenti controlla se il contatore di collegamenti è diventato zero e se lo fa, il sistema libera tutti i blocchi allocati per l'i-nodo e l'i-nodo stesso e ritorna all'applicazione.
Cosa succede che un'applicazione chiude un file? La funzione close()
decrementa il contatore aperto e ne controlla il valore. Se il valore è diverso da zero, la funzione torna all'applicazione. Altrimenti controlla se il contatore del collegamento i-node è zero. Se è zero, libera tutti i blocchi del file e l'i-node prima di tornare all'applicazione.
Questo meccanismo consente di "eliminare" un file mentre è aperto. Allo stesso tempo, l'applicazione che ha aperto un file ha ancora accesso ai dati nel file. Quindi, JRE, nel tuo esempio, mantiene ancora aperta la sua versione del file mentre sul disco è presente un'altra versione aggiornata.
Inoltre, questa funzione consente di aggiornare glibc (libc), la libreria principale di tutte le applicazioni, nel sistema senza interrompere il normale funzionamento.
finestre
20 anni fa non conoscevamo alcun file system diverso da FAT in DOS. Questo file system ha una struttura e principi di gestione diversi. Questi principi non consentono di eliminare un file quando viene aperto, quindi il DOS e Windows di recente devono rifiutare qualsiasi richiesta di eliminazione su un file aperto. Probabilmente NTFS consentirebbe lo stesso comportamento dei file system * nix ma Microsoft ha deciso di mantenere il comportamento abituale dell'eliminazione dei file.
Questa è la risposta Non breve, ma ora hai l'idea.
Modifica : una buona lettura delle fonti di Win32
confusione: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
Crediti a @Jon