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
mv
obsluž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
rename
funkceSouhrn
#include <stdio.h> int rename(const char *old, const char *new);
Popis
rename
způsobí, že soubor, jehož jméno je řetězec, na který ukazujeold
být od nynějška známý pod jménem
daným řetězcem, na který ukazujenew
. Soubor s názvemold
již není
pod tímto názvem přístupný. Pokud soubor pojmenovaný řetězcem ukazuje
nanew
existuje před voláním funkcerename
chování je implementačně definováno.Vrátí se
rename
funkce 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
newpath
již existuje, bude atomicky nahrazena, takže
neexistuje žádný bod, ve kterém by se jiný proces pokoušel o přístup knewpath
zjistí, že chybí. Pravděpodobně však bude existovat okno
, ve kterém jsou oběoldpath
anewpath
odkaz 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.