семантика flock () и fcntl () в glibc - PullRequest
1 голос
/ 21 марта 2019

Похожие: один , два

Утверждается, что flock() (BSD-блокировки) и fcntl() (блокировки уровня записи POSIX) дают пользователю несовместимую семантику, особенно в отношении снятия блокировки.

Однако в glibc flock() реализован в терминах POSIX fcntl(). (Я проверил это на официальном репозитории git, вот только видимая ссылка)

https://code.woboq.org/userspace/glibc/sysdeps/posix/flock.c.html#18

/ * Этот файл реализует flock' function in terms of the POSIX.1 fcntl ' запирающий механизм. В 4BSD это два несовместимых механизма блокировки, возможно с другой семантикой? * /

Как эти факты можно объединить?

Ответы [ 2 ]

1 голос
/ 26 марта 2019

В Linux flock - системный вызов . flock блокировки и fcntl блокировки независимы и не мешают друг другу (по крайней мере, в локальных файловых системах).

Исходный файл glibc sysdeps/posix/flock.c фактически не используется в Linux. Реальная реализация - это оболочка системного вызова, сгенерированная из этой строки в sysdeps/unix/sysv/linux/syscalls.list:

flock             -       flock           i:ii    __flock         flock

Блокировки OFD - это еще один вид блокировок, но они взаимодействуют с блокировками записи POSIX. Однако они имеют более разумное поведение с несколькими потоками, и закрытие одного дескриптора не освобождает все блокировки для одного и того же базового файла, удерживаемого одним и тем же процессом (что делает блокировку записи POSIX настолько трудной для использования в многопоточных процессах).

0 голосов
/ 22 марта 2019

Примечание.Это совершенно неправильно, смотрите принятый ответ.Все еще поддерживает его, поскольку у него есть несколько полезных ссылок

Ну, это было довольно скучно - fcntl использует ту же структуру flock в качестве аргумента и различает блокировки открытых файлов (BSD блокируется в моей записи выше) из блокировок файлов, связанных с процессом (блокировки уровня записи POSIX в моей записи выше) на основе значения поля l_pid.

glibc docs для открытых файлов Описание блокировок :

В открытых блокировках описания файлов используется та же структура flock, что и для связанных с процессом блокировок, в качестве аргумента (см. Блокировки файлов), а макросы для значений команд:также объявлено в заголовочном файле fcntl.h.Чтобы использовать их, макрос _GNU_SOURCE должен быть определен до включения любого заголовочного файла.

...

В отличие от блокировок, связанных с процессом, любая структура flock, используемая в качестве аргумента для открытия команд блокировки описания файла, должна иметь значение l_pid, равное 0. Кроме того, при возврате информацииЧто касается блокировки описания открытого файла в запросе F_GETLK или F_OFD_GETLK, поле l_pid в struct flock будет установлено в -1, чтобы указать, что блокировка не связана с процессом.

Также см. glibc doc о блокировках файлов, связанных с процессом

...