Estou escrevendo alguns scripts de shell para lidar com algumas coisas de imagem de disco e preciso usar dispositivos de loop para acessar algumas imagens de disco. No entanto, não tenho certeza de como alocar corretamente um dispositivo de loop sem expor meu programa a uma condição de corrida.
Eu sei que posso usar losetup -f
para obter o próximo dispositivo de loop não alocado e alocar esse dispositivo de loop da seguinte maneira:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
No entanto, no caso em que desejo executar várias instâncias do programa ao mesmo tempo, esse é quase um exemplo de condição de corrida e isso me incomoda bastante. Se eu tivesse várias instâncias desse programa em execução ou outros programas tentando também obter um dispositivo de loop, cada processo poderá não ser capaz de alocar o dispositivo de loop antes da próxima chamada losetup -f
, caso em que ambos os processos pensariam que o mesmo loop dispositivo está disponível, mas apenas um pode obtê-lo.
Eu poderia usar a sincronização externa para isso, mas gostaria de (se possível) evitar complexidade adicional. Além disso, outros programas que usam dispositivos de loop provavelmente não respeitariam a sincronização que eu possa criar.
Como posso evitar essa possível condição de corrida? Idealmente, eu gostaria de poder descobrir e vincular o dispositivo de loop atomicamente, por exemplo, com um comando como:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
No entanto, quando faço isso, $ld
não é atribuído ao caminho do dispositivo de loop e a sudo
saída, como em, sudo ld=$(losetup -f myfile.img)
dá erros de permissão.
</dev/tty
?