J'écris des scripts shell pour gérer certains trucs d'image disque, et j'ai besoin d'utiliser des périphériques de boucle pour accéder à certaines images disque. Cependant, je ne sais pas comment allouer correctement un périphérique de boucle sans exposer mon programme à une condition de concurrence critique.
Je sais que je peux utiliser losetup -f
pour obtenir le prochain périphérique de boucle non alloué, puis allouer ce périphérique de boucle comme ceci:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Cependant, dans le cas où je veux exécuter plusieurs instances du programme en même temps, c'est presque un exemple classique d'une condition de concurrence critique, et cela me dérange beaucoup. Si plusieurs instances de ce programme étaient en cours d'exécution ou que d'autres programmes essayaient également d'obtenir un périphérique de boucle, chaque processus pourrait ne pas être en mesure d'allouer le périphérique de boucle avant le prochain appel losetup -f
, auquel cas les deux processus penseraient que la même boucle est disponible, mais un seul peut l'obtenir.
Je pourrais utiliser la synchronisation externe pour cela, mais je voudrais (si possible) éviter une complexité supplémentaire. De plus, d'autres programmes qui utilisent des périphériques de boucle ne respecteraient probablement pas la synchronisation que je pourrais proposer.
Comment puis-je éviter cette condition de course potentielle? Idéalement, j'aimerais pouvoir découvrir et lier atomiquement le périphérique de boucle, par exemple avec une commande comme:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Cependant, lorsque je fais cela, il $ld
n'est pas attribué au chemin du périphérique de boucle, et le déplacement sudo
, comme dans, sudo ld=$(losetup -f myfile.img)
donne des erreurs d'autorisation.
</dev/tty
sert?