GNU/Linux >> Linux Esercitazione >  >> Linux

Linux - Linux facendo diversamente che mi permette di rimuovere/sostituire i file in cui Windows si lamenterebbe Il file è attualmente in uso?

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


Linux
  1. Copia i file nel terminale Linux

  2. Sposta i file nel terminale Linux

  3. Come utilizzare Netcat per trasferire file su Linux

  4. Nascondi i file nascosti di Linux in Windows

  5. Dove si trova il filesystem del sottosistema Linux in Windows 10?

Come usare il comando diff di Linux

Come utilizzare il comando ftp di Linux per caricare e scaricare file sulla shell

I 6 modi migliori per visualizzare i file in Linux

Strumenti Sysadmin:11 modi per usare il comando ls in Linux

Come utilizzare il comando Gzip in Linux?

Dov'è il file php.ini su un PC Linux/CentOS?