Jak mohu zkontrolovat, zda mv je atomic na mém fs (ext4)?
OS je Red Hat Enterprise Linux Server verze 6.8.
Obecně, jak to mohu zkontrolovat? Rozhlédl jsem se a nenašel jsem, zda je můj operační systém standardní POSIX.
Přijatá odpověď:
Je zajímavé, že se zdá, že odpověď může znít:„Záleží“.
Aby bylo jasno, mv je specifikováno jako
mvobslužný program provede akce ekvivalentnírename()funkce
Specifikace funkce přejmenování uvádí:
Toto
rename()funkce je pro běžné soubory ekvivalentní té
definované normou ISO C. Jeho zahrnutí zde rozšiřuje tuto
definici o akce s adresáři a specifikuje chování
, když nový parametr pojmenuje soubor, který již existuje. Tato
specifikace vyžaduje, aby akce funkce byla atomická.
Ale nejnovější specifikace ISO C pro rename() uvádí:
7.21.4.2
renamefunkceSouhrn
#include <stdio.h> int rename(const char *old, const char *new);Popis
renamezpůsobí, že soubor, jehož jméno je řetězec, na který ukazujeoldbýt od nynějška známý pod jménem
daným řetězcem, na který ukazujenew. Soubor s názvemoldjiž není
pod tímto názvem přístupný. Pokud soubor pojmenovaný řetězcem ukazuje
nanewexistuje před voláním funkcerename
chování je implementačně definováno.Vrátí se
renamefunkce vrátí nulu, pokud operace uspěje, nenulovou hodnotu, pokud selže, v takovém případě, pokud soubor existoval
dříve, je stále znám pod svým původním názvem.
Překvapivě si všimněte, že neexistuje žádný výslovný požadavek na atomičnost. Může to být vyžadováno někde jinde v nejnovějším veřejně dostupném standardu C, ale nepodařilo se mi to najít. Pokud někdo takový požadavek najde, úpravy a komentáře jsou více než vítány.
Podle manuálové stránky Linuxu:
Pokud
newpathjiž existuje, bude atomicky nahrazena, takže
neexistuje žádný bod, ve kterém by se jiný proces pokoušel o přístup knewpathzjistí, že chybí. Pravděpodobně však bude existovat okno
, ve kterém jsou oběoldpathanewpathodkaz na soubor, který se
přejmenovává.
Manuálová stránka Linuxu požaduje náhradu souboru bude atomický.
Testování a ověření tato atomicita může být velmi obtížná, pokud je potřeba zajít takto daleko. Není vám jasné, co máte na mysli při použití slova „Jak mohu zkontrolovat, zda je mv atomový“. Chcete požadavky/specifikaci/dokumentaci, že je atomární, nebo je skutečně potřebujete otestovat to?
Související:Získání PID okna kliknutím na něj?
Všimněte si také, že výše uvedené předpokládá dva názvy souborů operandů jsou ve stejném systému souborů. Nenašel jsem žádné standardní omezení pro mv nástroj k vynucení toho.