Příklad, který mám, je Minecraft. Když spouštím Bukkit na Linuxu, mohu odstranit nebo aktualizovat soubory .jar ve složce /plugins a jednoduše spustit příkaz ‚reload‘.
Ve Windows musím přerušit celý proces serveru, protože si bude stěžovat, že se soubor .jar právě používá, když se ho pokusím odstranit nebo nahradit.
To je pro mě úžasné, ale proč se to děje?
Co tady Linux dělá jinak?
Přijatá odpověď:
Linux maže soubor úplně jinak než Windows. Nejprve stručné vysvětlení toho, jak jsou soubory spravovány v *unixových nativních souborových systémech.
Soubor je uložen na disku ve víceúrovňové struktuře zvané i-node
. Každý i-uzel má jedinečné číslo na jediném souborovém systému. Struktura i-uzlu uchovává různé informace o souboru, jako je jeho velikost, datové bloky přidělené souboru atd., ale pro tuto odpověď je nejdůležitějším datovým prvkem link counter
. directories
jsou soubory, které uchovávají záznamy o souborech. Každý záznam má číslo i-uzlu, na který odkazuje, délku názvu souboru a samotný název souboru. Toto schéma umožňuje mít „ukazatele“, tj. „odkazy“ na stejný soubor na různých místech s různými názvy. Čítač odkazů i-uzlu ve skutečnosti uchovává počet odkazů, které odkazují na tento i-uzel.
Co se stane, když nějaký proces otevře soubor? Nejprve open()
funkce vyhledá záznam souboru. Poté zkontroluje, zda struktura i-uzlu v paměti pro tento i-uzel již existuje. To se může stát, pokud některá aplikace již tento soubor otevřela. Jinak systém inicializuje novou strukturu i-uzlu v paměti. Poté systém zvýší otevřený čítač struktury i-uzlu v paměti a vrátí aplikaci její deskriptor souboru.
Volání linuxové knihovny pro odstranění souboru se nazývá unlink
. Tato funkce odstraní záznam souboru z adresáře a sníží počítadlo odkazů i-uzlu. Pokud systém zjistil, že struktura i-uzlu v paměti existuje a jeho otevřený čítač není nulový, pak toto volání vrátí řízení aplikaci. V opačném případě zkontroluje, zda se čítač odkazů stal nulovým, a pokud ano, systém uvolní všechny bloky přidělené pro i-uzel a samotný i-uzel a vrátí se do aplikace.
Co se stane, že aplikace zavře soubor? Funkce close()
sníží otevřené počítadlo a zkontroluje jeho hodnotu. Pokud je hodnota nenulová, funkce se vrátí do aplikace. Jinak zkontroluje, zda je čítač spojení i-uzlu nulový. Pokud je nula, uvolní všechny bloky souboru a i-uzel před návratem do aplikace.
Tento mechanismus umožňuje „smazat“ soubor, když je otevřen. Aplikace, která soubor otevřela, má zároveň stále přístup k datům v souboru. Takže JRE ve vašem příkladu stále ponechává svou verzi souboru otevřenou, zatímco na disku je jiná, aktualizovaná verze.
Související:Soubor ODBK a jak jej obnovit?Navíc vám tato funkce umožňuje aktualizovat glibc(libc) – základní knihovnu všech aplikací – ve vašem systému bez přerušení jeho normálního provozu.
Windows
Před 20 lety jsme pod DOSem neznali jiný souborový systém než FAT. Tento souborový systém má jinou strukturu a principy správy. Tyto principy vám neumožňují smazat soubor při jeho otevření, takže DOS a v poslední době Windows musí odmítnout jakékoli požadavky na odstranění otevřeného souboru. NTFS by pravděpodobně umožnilo stejné chování jako souborové systémy *nix, ale Microsoft se rozhodl zachovat obvyklé chování při mazání souborů.
Toto je odpověď. Není to krátké, ale teď máte nápad.
Upravit :
Dobré čtení o zdrojích Win32
nepořádek:https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 Poděkování @Jon