Tôi đang viết một số tập lệnh shell để xử lý một số nội dung hình ảnh đĩa và tôi cần sử dụng các thiết bị lặp để truy cập một số hình ảnh đĩa. Tuy nhiên, tôi không chắc chắn làm thế nào để phân bổ đúng thiết bị vòng lặp mà không để chương trình của tôi gặp tình trạng đua.
Tôi biết rằng tôi có thể sử dụng losetup -f
để có được thiết bị vòng lặp chưa phân bổ tiếp theo và sau đó phân bổ thiết bị vòng lặp như thế này:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Tuy nhiên, trong trường hợp tôi muốn chạy nhiều phiên bản chương trình cùng một lúc, đây gần như là một ví dụ trong sách giáo khoa về điều kiện cuộc đua và điều đó làm phiền tôi khá nhiều. Nếu tôi có nhiều phiên bản của chương trình này đang chạy hoặc các chương trình khác đang cố gắng có được một thiết bị lặp, thì mỗi quy trình có thể không thể phân bổ thiết bị vòng lặp trước cuộc gọi tiếp theo losetup -f
, trong trường hợp cả hai quy trình sẽ nghĩ rằng cùng một vòng lặp thiết bị có sẵn, nhưng chỉ có một người có thể nhận được nó.
Tôi có thể sử dụng đồng bộ hóa bên ngoài cho việc này, nhưng tôi muốn (nếu có thể) tránh sự phức tạp thêm. Ngoài ra, các chương trình khác sử dụng thiết bị lặp sẽ không tôn trọng bất kỳ sự đồng bộ hóa nào tôi có thể đưa ra.
Làm thế nào tôi có thể tránh điều kiện cuộc đua tiềm năng này? Lý tưởng nhất là tôi muốn có thể khám phá và liên kết thiết bị vòng lặp một cách nguyên tử, ví dụ như bằng một lệnh như:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Tuy nhiên, khi tôi làm điều đó, $ld
không được gán cho đường dẫn thiết bị vòng lặp và di chuyển sudo
ra ngoài, như trong các sudo ld=$(losetup -f myfile.img)
lỗi cấp phép.
</dev/tty
?