L'esempio che ho è Minecraft. Quando eseguo Bukkit su Linux, posso rimuovere o aggiornare i file .jar nella cartella /plugins ed eseguire semplicemente il comando "reload".
In Windows, devo interrompere l'intero processo del server perché si lamenterà del fatto che il file .jar è attualmente in uso quando provo a rimuoverlo o sostituirlo.
Questo è fantastico per me, ma perché succede?
Che cosa sta facendo Linux diversamente qui?
Risposta accettata:
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 denominata i-node
. Ogni i-node ha un numero univoco sul singolo filesystem. La struttura i-node conserva diverse informazioni su un file, come la sua dimensione, i blocchi di dati allocati per il file ecc., ma per il bene di questa risposta l'elemento di dati più importante è un link counter
. Le directories
sono i file che conservano i record sui file. Ogni record ha il numero i-node a cui fa riferimento, la lunghezza del nome del file e il nome del file stesso. Questo schema consente di avere "puntatori", cioè "collegamenti" allo stesso file in luoghi diversi con nomi diversi. Il contatore di link dell'i-node mantiene effettivamente il numero di link che fanno riferimento a questo i-node.
Cosa succede quando un processo apre il file? Per prima cosa open()
la funzione cerca il record del file. Quindi controlla se la struttura i-node in memoria per questo i-node esiste già. Ciò può accadere se alcune applicazioni hanno già aperto questo file. In caso contrario, il sistema inizializza una nuova struttura i-node in memoria. Quindi il sistema aumenta il contatore di aperture della struttura i-node in memoria e restituisce all'applicazione il suo descrittore di file.
La chiamata alla libreria Linux per eliminare un file si chiama unlink
. Questa funzione rimuove il record del file da una directory e decrementa il contatore dei collegamenti dell'i-node. Se il sistema rileva che esiste una struttura i-node in memoria e il relativo contatore di apertura non è zero, questa chiamata restituisce il controllo all'applicazione. Altrimenti controlla se il link-counter è diventato zero e in tal caso il sistema libera tutti i blocchi allocati per l'i-node e l'i-node stesso e torna all'applicazione.
Cosa succede se un'applicazione chiude un file? La funzione close()
decrementa il contatore aperto e ne verifica il valore. Se il valore è diverso da zero la funzione ritorna all'applicazione. Altrimenti controlla se il contatore del collegamento i-node è zero. Se è zero, libera tutti i blocchi del file e dell'i-node prima di tornare all'applicazione.
Questo meccanismo permette di “cancellare” 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 è presente un'altra versione aggiornata sul disco.
Correlati:un file ODBK e come ripristinarlo?Inoltre, questa funzione ti consente di aggiornare glibc(libc) – la libreria principale di tutte le applicazioni – nel tuo sistema senza interromperne il normale funzionamento.
Finestre
20 anni fa non conoscevamo nessun altro file system oltre a FAT sotto 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 ultimamente Windows devono negare 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 a breve, ma ora hai l'idea.
Modifica :
Una buona lettura dei sorgenti di Win32
pasticcio:https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 Crediti a @Jon