Bazı disk görüntü şeylerini işlemek için bazı kabuk komut dosyaları yazıyorum ve bazı disk görüntülerine erişmek için döngü aygıtlarını kullanmam gerekiyor. Ancak, benim programımı bir yarış durumuna maruz kalmadan bir döngü cihazı düzgün tahsis nasıl emin değilim.
Bir losetup -f
sonraki ayrılmamış döngü aygıtı almak için kullanabileceğinizi biliyorum , ve sonra bu döngü aygıtını şu şekilde tahsis edebilirim:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Ancak, aynı anda programın birden fazla örneğini çalıştırmak istediğim durumda, bu neredeyse bir yarış durumu ders kitabı örneğidir ve bu beni oldukça rahatsız ediyor. Bu programın birden fazla örneğini çalıştırıyor olsaydım veya bir döngü aygıtı almaya çalışan başka programlar da varsa, her işlem bir sonraki çağrıdan önce döngü aygıtını ayıramayabilir losetup -f
, bu durumda her iki işlem de aynı döngüyü düşünürdü kullanılabilir, ancak yalnızca bir tanesi bunu alabilir.
Bunun için harici senkronizasyon kullanabilirsiniz, ancak (mümkünse) ek karmaşıklıktan kaçınmak istiyorum. Ayrıca, döngü aygıtlarını kullanan diğer programlar, karşılaşabileceğim senkronizasyonlara saygı duymaz.
Bu potansiyel yarış koşulundan nasıl kaçınabilirim? İdeal olarak, döngü cihazını atomik olarak, örneğin aşağıdaki gibi bir komutla keşfetmek ve bağlamak istiyorum:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Ancak, bunu yaptığımda $ld
, döngü aygıt yoluna atanmaz ve izin verir sudo
gibi , dışarı taşıma sudo ld=$(losetup -f myfile.img)
.
</dev/tty
için?