Saya menulis beberapa skrip shell untuk menangani beberapa hal gambar disk, dan saya perlu menggunakan perangkat loop untuk mengakses beberapa gambar disk. Namun, saya tidak yakin bagaimana cara mengalokasikan perangkat loop dengan benar tanpa memaparkan program saya ke kondisi balapan.
Saya tahu bahwa saya dapat menggunakan losetup -f
untuk mendapatkan perangkat loop yang tidak teralokasi berikutnya, dan kemudian mengalokasikan perangkat loop seperti ini:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Namun, dalam kasus di mana saya ingin menjalankan beberapa contoh program pada saat yang sama, ini hampir merupakan contoh buku teks dari kondisi lomba, dan itu cukup mengganggu saya. Jika saya memiliki beberapa instance dari program ini berjalan, atau program lain yang mencoba juga mendapatkan perangkat loop, maka setiap proses mungkin tidak dapat mengalokasikan perangkat loop sebelum panggilan berikutnya losetup -f
, dalam hal ini kedua proses akan berpikir bahwa loop yang sama perangkat tersedia, tetapi hanya satu yang bisa mendapatkannya.
Saya dapat menggunakan sinkronisasi eksternal untuk ini, tetapi saya ingin (jika mungkin) menghindari kompleksitas tambahan. Selain itu, program lain yang menggunakan perangkat loop sepertinya tidak akan menghargai sinkronisasi apa pun yang mungkin saya buat.
Bagaimana saya bisa menghindari kondisi lomba potensial ini? Idealnya, saya ingin dapat menemukan dan mengikat perangkat loop secara atom, misalnya dengan perintah seperti:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Namun, ketika saya melakukan itu, $ld
tidak mendapatkan ditugaskan ke jalur perangkat loop, dan pindah sudo
keluar, karena sudo ld=$(losetup -f myfile.img)
memberikan kesalahan izin.
</dev/tty
?