Почему при использовании flock (2) для блокировки файла необходимо создавать файл блокировки?

Я изучаю блокировку файлов с помощью flock(2), и я хочу написать небольшой служебный класс C ++ для обработки блокировки. Я довольно много читал в Интернете, но есть одна часть, которую я не понимаю.

Например, в Оптимальный метод файла блокировки:

1: open the lock file creating it if it doesn't exist
2: ask for an exclusive lock an agreed byte range in the lock file
3: when the lock is granted then
    4: <do my processing here>
    5: release my lock
    6: close the lock file
end

Что это за файл блокировки? Я читал, что он используется для управления блокировками, но я думал, что это именно то, для чего flock(2) используется? Так зачем нам создавать дополнительный файл? И почему этот файл не удаляется после того, как я перестал нуждаться в блокировке? Разве это не означает, что для каждого файла, который я когда-либо открывал (с включенным методом блокировки), где-то есть файл блокировки?

Было бы здорово, если бы кто-нибудь мог объяснить это или указать мне на какой-то ресурс, я уже потратил на это несколько часов.


person picklepick    schedule 13.11.2019    source источник
comment
flock работает с файловым дескриптором, а не с файлом. Разница в If a process uses open(2) (or similar) to obtain more than one descriptor for the same file, these descriptors are treated independently by flock().. В ответе, который вы связали, не обсуждается flock, а используется общий отдельный файл блокировки.   -  person KamilCuk    schedule 13.11.2019
comment
Поэтому, если я хочу отредактировать myfile.txt, используя open(2), я получаю дескриптор файла, а затем передаю этот fd в flock(2). Я до сих пор не понимаю, зачем мне создавать дополнительный файл блокировки, для чего этот файл используется?   -  person picklepick    schedule 13.11.2019
comment
Ответ, который вы связали, не обсуждает flock. Что бы делали без flock? Вы можете создать отдельный файл блокировки. Файл блокировки, если он существует, означает, что файл заблокирован. Поскольку open(... O_CREAT | O_EXCL) должен быть атомарным, вы можете проверить, существует ли файл, одновременно с его созданием.   -  person KamilCuk    schedule 13.11.2019
comment
Этот метод используется, когда объект, который вы хотите заблокировать, не является файлом.   -  person user253751    schedule 13.11.2019
comment
Спасибо за помощь! В этой ветке есть несколько ответов, которые обсуждают flock. Например, ответ «chmike» сначала создает файл блокировки int fd = open( lockName, O_RDWR|O_CREAT, 0666 );, а затем использует flock для этого файла: if( fd >= 0 && flock( fd, LOCK_EX | LOCK_NB ) < 0 ). Возможно, я что-то путаю, но мне кажется, что для каждого файла, который я хочу открыть, создается дополнительный файл блокировки, а затем блокировка применяется к этому файлу, а не к исходному файлу. Но я не понимаю почему.   -  person picklepick    schedule 13.11.2019
comment
@ user253751 ах, хорошо, так что для ясности, если я использую flock в текстовом файле, нет необходимости создавать отдельный файл блокировки? Потому что это именно то, что мой профессор хочет, чтобы я выполнял задание. Но я понятия не имею, почему и из ваших ответов и того, что я читал в других источниках, я понимаю, что это бессмысленно?   -  person picklepick    schedule 13.11.2019