Являются ли блокировки файлов POSIX повторно входными?

Я использую mandatory блокировки файлов POSIX через fcntl. Мне интересно, являются ли эти блокировки повторными, т.е. может ли процесс получить блокировку, которой он уже владеет?


person paradigmatic    schedule 04.11.2012    source источник
comment
Вы уверены, что имеете в виду обязательную блокировку файлов? В прошлый раз, когда я смотрел, POSIX не поддерживал обязательные блокировки.   -  person cdarke    schedule 04.11.2012
comment
@cdarke Упс! Я имел в виду консультативный... Спасибо за сообщение.   -  person paradigmatic    schedule 04.11.2012
comment
Справедливо. Формулировка стандарта POSIX по этому поводу двусмысленна: монопольная блокировка не позволяет любому другому процессу устанавливать совместную блокировку или монопольную блокировку для любой части защищенной области. Однако для F_SETLKW сказано: поток должен ждать, пока запрос не будет удовлетворен. Сосать и посмотреть в вашей реализации?   -  person cdarke    schedule 04.11.2012
comment
Блокировки fcntl не являются повторными. Вы должны вручную обернуть коды блокировки и разблокировки действительными проверками. И поведение fcntl может варьироваться в зависимости от вашей системы реализации.   -  person askmish    schedule 04.11.2012


Ответы (1)


Консультативные блокировки до fcntl применяются для каждого процесса и просто накапливают заблокированные интервалы в файле для данного процесса. То есть приложение должно отслеживать интервалы, и любой вызов разблокировки для интервала разблокирует его, независимо от того, сколько вызовов блокировки было сделано для этого интервала.

Хуже того, закрытие любого файлового дескриптора для файла отменяет все блокировки файла:

Помимо снятия с помощью явного F_UNLCK, блокировки записи автоматически снимаются, когда процесс завершается или если он закрывает любой дескриптор файла, ссылающийся на файл, для которого удерживаются блокировки. Это плохо: это означает, что процесс может потерять блокировку файла, такого как /etc/passwd или /etc/mtab, когда по какой-то причине библиотечная функция решит открыть, прочитать и закрыть его.

person Jens Gustedt    schedule 04.11.2012
comment
Вам не нужно отслеживать право собственности самостоятельно. Поскольку fcntl блокирует владельцев записей и существует API для чтения текущего владельца, вы можете просто проверить, являетесь ли вы владельцем, прежде чем блокировать, и если да, то пропустите этапы блокировки/разблокировки. - person R.. GitHub STOP HELPING ICE; 04.11.2012
comment
@R .. вы имеете в виду поле l_pid структуры? Это не подходит для отслеживания нескольких блокировок одним и тем же процессом, оно только сообщает вам (один из) процесс, который заблокирует вас, а не если вы уже удерживаете (часть) диапазон для одного и того же процесса. - person Jens Gustedt; 04.11.2012
comment
Если вы сложно используете перекрывающиеся диапазоны, то да, я согласен. Я предполагаю либо блокировку всего файла, либо блокировку непересекающихся диапазонов, где вы можете предположить, что если что-либо в диапазоне заблокировано, весь диапазон заблокирован одним процессом. - person R.. GitHub STOP HELPING ICE; 04.11.2012