Piszę kilka skryptów powłoki, aby obsłużyć niektóre obrazy dysków, i muszę korzystać z urządzeń pętlowych, aby uzyskać dostęp do niektórych obrazów dysków. Nie jestem jednak pewien, jak prawidłowo przydzielić urządzenie pętlowe bez narażania mojego programu na wyścig.
Wiem, że mogę użyć losetup -f
następnego nieprzydzielonego urządzenia pętli, a następnie przydzielić to urządzenie pętli w następujący sposób:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Jednak w przypadku, gdy chcę uruchomić wiele instancji programu w tym samym czasie, jest to prawie podręcznikowy przykład warunków wyścigu, co mnie bardzo niepokoi. Gdybym miał uruchomione wiele wystąpień tego programu lub inne programy próbujące również uzyskać urządzenie pętlowe, to każdy proces może nie być w stanie przydzielić urządzenia pętlowego przed następnym wywołaniem losetup -f
, w którym to przypadku oba procesy będą myśleć, że ta sama pętla urządzenie jest dostępne, ale tylko jeden może je zdobyć.
Mógłbym do tego użyć zewnętrznej synchronizacji, ale chciałbym (jeśli to możliwe) uniknąć dodatkowej złożoności. Ponadto inne programy korzystające z urządzeń pętlowych prawdopodobnie nie będą szanować synchronizacji, jaką wymyślę.
Jak mogę uniknąć tego potencjalnego wyścigu? Idealnie chciałbym móc atomowo wykryć i powiązać urządzenie pętli, na przykład za pomocą polecenia:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Jednak gdy to robię, $ld
nie zostaje przypisany do ścieżki urządzenia pętli i przeniesienie się na sudo
zewnątrz, ponieważ w sudo ld=$(losetup -f myfile.img)
daje błędy uprawnień.
</dev/tty
za?