Заблокировать или разблокировать секцию в файле
#include <unistd.h>int lockf( int filedes,int function,off_t size );
<unistd.h>
) следующие: 0
, блокируется секция от текущей точки смещения до максимально возможного смещения файла (то есть от текущей точки смещения до настоящего или любого будущего конца файла). Не нужно выделять память, чтобы совершить блокировку, поскольку блокировки могут существовать после конца файла.libc
Функцию lockf() можно использовать для многопоточной блокировки секции в файле. Если другие потоки вызывают lockf(), чтобы попытаться заблокировать заблокированную секцию файла, эти вызовы либо возвращают значение ошибки, либо блокируются до тех пор, пока секция не будет разблокирована.
Все блокировки для процесса снимаются, когда процесс завершается. Блокировка записей с помощью lockf() поддерживается для обычных файлов и может поддерживаться для других файлов.
Секции заблокированные с помощью F_LOCK или F_TLOCK могут, полностью или частично, содержать или содержаться в ранее заблокированной секции для того же процесса. Когда это происходит или если возникают соседние заблокированные секции, эти секции объединяются в одну заблокированную секцию.
Блокировки файлов снимаются при первом закрытии процессом блокировки любого файлового дескриптора для файла.
F_ULOCK запросы могут снять блокировку (полностью или частично) с одной или нескольких заблокированных секций, контролируемых процессом. Заблокированные секции разблокируются, начиная с текущей точки смещения файла через size bytes или до конца файла, если size равно (off_t)0
. Когда вся заблокированная секция не разблокирована (то есть, когда начало или конец области, которая должна быть разблокирована, попадает в заблокированную секцию), оставшиеся части этой секции все еще блокируются процессом. Разблокирование центральной части заблокированной секции приводит к тому, что, оставшиеся заблокированнми, начальная и конечная части становятся двумя отдельными заблокированными секциями.
Возможные взаимоблокировки могут возникнуть, если потоки процесса, контролирующего заблокированную секцию, блокируются путем получения доступа к заблокированной секции другого процесса. Если система обнаруживает, что может возникнуть взаимоблокировка, lockf() завершается ошибкой с EDEADLK
.
Взаимодействия между fcntl() и блокировакми lockf() яляются неопределенными. Блокировка секции прерывается любым сигналом.
Если size является максимальным значением типа off_t
и у процесса уже есть существующая блокировка размера 0
в этом диапазоне (что указывает на блокировку всего файла), тогда запрос F_ULOCK обрабатывается так же, как и запрос F_ULOCK с размером 0
. В противном случае запрос F_ULOCK пытается разблокировать только запрошенную секцию. Попытка заблокировать секцию файла, связанную с буферизованным потоком, дает неопределенные результаты.
0
. 0
, то последнего байта в запрошенной секции не может быть правильно представлен в объекте типа off_t
. POSIX 1003.1 X/Open Systems Interfaces Extension
Предыдущий раздел: Описание API системной библиотеки