Cosa sta facendo diversamente Linux che mi consente di rimuovere / sostituire i file in cui Windows si lamenterebbe che il file è attualmente in uso?


30

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à che il file .jar è attualmente in uso quando provo a rimuoverlo o sostituirlo.

Questo è fantastico per me, ma perché succede? Cosa sta facendo diversamente Linux qui?

Risposte:


35

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 directoriessono 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 Win32confusione: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 Crediti a @Jon



apri la finestra cmd, passa a questa directory e usa ren MonsterB.jar MonsterB.ja_- dovrebbe funzionare. Funziona sicuramente con file dll ed exe.
Serge,

1
no, Windows mappa parti del file eseguibile in memoria
Serge,

9
NTFS in realtà lo supporta, ma il fopencomando C Library chiama CreateFilecon il FILE_SHARE_DELETEflag, quindi non lo consente per la maggior parte dei programmi che aprono file.
Casuale 832,

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.