Có một tệp mở không phải là khóa bởi vì, nếu mỗi quá trình phải kiểm tra xem tệp có được mở trước không và tiến hành nếu nó là hoặc tạo / mở nó nếu không, thì hai quá trình có thể kiểm tra đồng thời, cả hai đều tìm thấy rằng nó không mở, sau đó cả hai tạo hoặc mở nó.
Để sử dụng tệp dưới dạng khóa, thao tác kiểm tra và khóa phải là một thao tác không bị gián đoạn. Bạn có thể đạt được điều này trong hệ thống tệp Unix bằng cách tạo một tệp có chế độ chỉ đọc và xóa nó để mở khóa. Nếu tệp tồn tại (và chỉ đọc), việc tạo tệp sẽ thất bại, do đó bạn có thể kiểm tra và khóa trong một hoạt động nguyên tử duy nhất.
Nếu quy trình khóa của bạn là tập lệnh shell sẽ chạy dưới dạng daemon, bạn có thể nhận được hiệu ứng này bằng cách sử dụng umask
, cài đặt theo quy trình đặt các quyền mà tệp mới được tạo với:
oldumask = $ (ô)
umask 222 # tạo tập tin không thể chấp nhận cho chủ sở hữu quá
nếu tiếng vang $$> / var / lock / foo
sau đó
: khóa thành công
khác
: khóa không thành công
fi
um $ $ oldumask
Điều này cũng ghi quá trình sở hữu 'PID vào tệp, giải quyết vấn đề khác của bạn:
cat /var/lock/foo
Liên quan đến câu hỏi cụ thể "Quy trình nào mở tệp này?", Điều này có thể hữu ích khi bạn muốn ngắt kết nối hệ thống tệp nhưng không thể vì một số quy trình có tệp mở trong đó. Nếu bạn không có sẵn các lệnh đó, bạn có thể hỏi
/proc
bằng root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
hoặc, với tư cách là người sử dụng:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'