Pokud je soubor přesunut (ve stejném souborovém systému) nebo přejmenován, zůstane popisovač souboru otevřený a lze jej stále používat ke čtení a zápisu souboru.
Pokud je soubor odstraněn, zůstane popisovač souboru otevřený a lze jej stále používat (toto někteří lidé neočekávají). Soubor nebude skutečně odstraněn, dokud nebude zavřen poslední popisovač.
Pokud je soubor nahrazen novým souborem, záleží přesně jak. Pokud je obsah souboru přepsán, bude popisovač souboru stále platný a bude mít přístup k novému obsahu. Pokud je existující soubor odpojen a je vytvořen nový se stejným názvem, nebo pokud je nový soubor přesunut do existujícího souboru pomocí rename()
, je to stejné jako smazání (viz výše) – to znamená, že popisovač souboru bude nadále odkazovat na originál verze souboru.
Obecně platí, že jakmile je soubor otevřen, je soubor otevřený a nikdo, kdo mění strukturu adresářů, to nemůže změnit – může soubor přesunout, přejmenovat nebo na jeho místo umístit něco jiného, prostě zůstane otevřený.
V Unixu nedochází k mazání, pouze unlink()
, což dává smysl, protože nemusí nutně smazat soubor - pouze odstraní odkaz z adresáře.
Pokud na druhé straně základní zařízení zmizí (např. odpojení USB), pak popisovač souboru již nebude platný a pravděpodobně způsobí IO/chybu při jakékoli operaci. Přesto to musíte zavřít. To bude platit, i když bude zařízení znovu zapojeno, protože v tomto případě není rozumné ponechat soubor otevřený.
Úchyty souborů ukazují na inode, nikoli na cestu, takže většina vašich scénářů stále funguje, jak předpokládáte, protože úchyt stále ukazuje na soubor.
Konkrétně se scénářem odstranění – funkce se z nějakého důvodu nazývá „unlink“, zničí „spojení“ mezi názvem souboru (dentry) a souborem. Když otevřete soubor a poté jej odpojíte, soubor ve skutečnosti stále existuje, dokud jeho počet odkazů neklesne na nulu, což je okamžik, kdy zavřete ovladač.
Upravit: V případě hardwaru jste otevřeli úchyt pro konkrétní uzel zařízení, pokud zařízení odpojíte, jádro selže všechny přístupy k němu, i když se zařízení vrátí. Budete muset zařízení zavřít a znovu otevřít.
U ostatních operací si nejsem jistý, ale co se týká mazání:K mazání prostě nedojde (fyzicky, tedy v souborovém systému), dokud se nezavře poslední otevřený handle k souboru. Proto by nemělo být možné smazat soubor z vaší aplikace.
Několik aplikací (které mi nepřijdou na mysl) spoléhá na toto chování tím, že vytváří, otevírá a okamžitě maže soubory, které pak žijí přesně tak dlouho jako aplikace – což umožňuje ostatním aplikacím, aby věděly o životním cyklu první aplikace, aniž by musely podívejte se na procesní mapy a podobně.
Je možné, že podobné úvahy platí i pro ostatní věci.