Я пишу несколько сценариев оболочки для обработки некоторых образов дисков, и мне нужно использовать петлевые устройства для доступа к некоторым образам дисков. Тем не менее, я не уверен, как правильно распределить петлевые устройства, не подвергая мою программу состоянию гонки.
Я знаю, что могу использовать 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
?