В чем разница между lockf и fcntl:
Во многих системах библиотечная подпрограмма lockf()
является просто оболочкой для fcntl()
. То есть lockf
предлагает подмножество функций, которые fcntl
делает.
Источник
Но в некоторых системах блокировки fcntl
и lockf
полностью независимы.
Источник
Поскольку это зависит от реализации, всегда используйте одно и то же соглашение. Поэтому либо всегда используйте lockf из обоих ваших процессов, либо всегда используйте fcntl. Есть большая вероятность, что они будут взаимозаменяемыми, но безопаснее использовать тот же.
Какой из них вы выбрали, не имеет значения.
Некоторые примечания об обязательных и консультативных блокировках:
Блокировка в unix / linux по умолчанию рекомендация , что означает, что другие процессы не должны следовать установленным правилам блокировки. Поэтому не имеет значения, каким образом вы блокируете, если ваши взаимодействующие процессы также используют то же соглашение.
Linux поддерживает обязательную блокировку, но только если ваша файловая система смонтирована с включенным параметром и специальными атрибутами файла. Вы можете использовать mount -o mand
для монтирования файловой системы и установить атрибуты файла g-x,g+s
для включения обязательных блокировок, затем используйте fcntl
или lockf
. Для получения дополнительной информации о том, как работают обязательные блокировки, см. здесь .
Обратите внимание, что блокировки применяются не к отдельному файлу, а к индексу. Это означает, что 2 имени файла, которые указывают на одни и те же данные файла, будут иметь одинаковый статус блокировки.
В Windows, с другой стороны, вы можете активно открывать файл исключительно, и это не позволит другим процессам полностью его открыть. Даже если они хотят. Т.е. замки обязательны. То же самое касается Windows и блокировки файлов. Любой процесс с дескриптором открытого файла с соответствующим доступом может заблокировать часть файла, и никакой другой процесс не сможет получить доступ к этой части.
Как работают обязательные блокировки в Linux:
Что касается обязательных блокировок, то если процесс блокирует область файла с помощью блокировки чтения, то другим процессам разрешается чтение, но не запись в этот регион. Если процесс блокирует область файла с помощью блокировки записи, то другим процессам не разрешается ни читать, ни записывать в файл. То, что происходит, когда процессу не разрешен доступ к части файла, зависит от того, указали вы O_NONBLOCK
или нет. Если блокировка установлена, он будет ждать выполнения операции. Если блокировка не установлена, вы получите код ошибки EAGAIN
.
Предупреждение NFS:
Будьте осторожны, если вы используете команды блокировки при монтировании NFS. Поведение не определено, и реализация широко варьируется, использовать ли только локальную блокировку или поддерживать удаленную блокировку.