Я использую mandatory блокировки файлов POSIX через fcntl
. Мне интересно, являются ли эти блокировки повторными, т.е. может ли процесс получить блокировку, которой он уже владеет?
Являются ли блокировки файлов POSIX повторно входными?
Ответы (1)
Консультативные блокировки до fcntl
применяются для каждого процесса и просто накапливают заблокированные интервалы в файле для данного процесса. То есть приложение должно отслеживать интервалы, и любой вызов разблокировки для интервала разблокирует его, независимо от того, сколько вызовов блокировки было сделано для этого интервала.
Хуже того, закрытие любого файлового дескриптора для файла отменяет все блокировки файла:
Помимо снятия с помощью явного F_UNLCK, блокировки записи автоматически снимаются, когда процесс завершается или если он закрывает любой дескриптор файла, ссылающийся на файл, для которого удерживаются блокировки. Это плохо: это означает, что процесс может потерять блокировку файла, такого как /etc/passwd или /etc/mtab, когда по какой-то причине библиотечная функция решит открыть, прочитать и закрыть его.
fcntl
блокирует владельцев записей и существует API для чтения текущего владельца, вы можете просто проверить, являетесь ли вы владельцем, прежде чем блокировать, и если да, то пропустите этапы блокировки/разблокировки.
- person R.. GitHub STOP HELPING ICE; 04.11.2012
l_pid
структуры? Это не подходит для отслеживания нескольких блокировок одним и тем же процессом, оно только сообщает вам (один из) процесс, который заблокирует вас, а не если вы уже удерживаете (часть) диапазон для одного и того же процесса.
- person Jens Gustedt; 04.11.2012
fcntl
не являются повторными. Вы должны вручную обернуть коды блокировки и разблокировки действительными проверками. И поведениеfcntl
может варьироваться в зависимости от вашей системы реализации. - person askmish   schedule 04.11.2012