Я пишу кілька скриптів оболонки для обробки деяких зображень диска, і мені потрібно використовувати петльові пристрої для доступу до деяких зображень диска. Однак я не впевнений, як правильно розподілити циклічний пристрій, не піддаючи програмі перегоновий стан.
Я знаю, що можу losetup -f
отримати наступний нерозподілений пристрій циклу, а потім виділити такий пристрій циклу таким чином:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Однак у випадку, коли я хочу запускати кілька екземплярів програми одночасно, це майже підручник із прикладу перегонів, і це мене дуже турбує. Якби у мене було кілька запущених примірників цієї програми або інших програм, що намагаються також отримати циклічний пристрій, то кожен процес може не мати змоги виділити пристрій циклу до наступного виклику losetup -f
, і в цьому випадку обидва процеси вважають, що той самий цикл пристрій доступний, але лише один може отримати його.
Я міг би використовувати для цього зовнішню синхронізацію, але хотів би (по можливості) уникати додаткових складностей. Крім того, інші програми, які використовують петлеві пристрої, швидше за все, не поважатимуть будь-яку синхронізацію.
Як я можу уникнути цього потенційного стану гонки? В ідеалі я хотів би мати можливість виявити і зв’язати циклічний пристрій атомним шляхом, наприклад, за допомогою команди типу:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Однак, коли я це роблю, $ld
не привласнюється до контуру пристрою циклу, а переміщення sudo
назовні, як і в sudo ld=$(losetup -f myfile.img)
помилках дозволу.
</dev/tty
?