ฉันกำลังเขียนเชลล์สคริปต์บางตัวเพื่อจัดการกับอิมเมจดิสก์บางอย่างและฉันต้องใช้อุปกรณ์วนรอบเพื่อเข้าถึงอิมเมจดิสก์บางตัว อย่างไรก็ตามฉันไม่แน่ใจว่าจะจัดสรรอุปกรณ์ลูปอย่างถูกต้องโดยไม่เปิดเผยโปรแกรมของฉันให้อยู่ในสภาพการแข่งขันได้อย่างไร
ฉันรู้ว่าฉันสามารถใช้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
หา?