Любого доступа (чтение или запись) будет достаточно для системного вызова Linux flock
, чтобы установить блокировку файла, в отличие от fcntl
блокировки, для которой требуется доступ на чтение для блокировка чтения и запись для блокировки записи.
Возможно, вы используете lib c, которая имитирует flock
поверх fcntl
. Чтобы получить то, что вам нужно, вызовите системный вызов напрямую через syscall
:
#include <sys/syscall.h>
#include <unistd.h>
// from include/uapi/asm-generic/fcntl.h
#define SYS_LOCK_SH 1
#define SYS_LOCK_EX 2
#define SYS_LOCK_UN 8
static int sys_flock(int fd, int op)
{
return (int) syscall(SYS_flock, fd, op);
}
В результате должна завершиться следующая программа:
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>
#define SYS_LOCK_EX 2
static long sys_flock(int fd, int flags)
{
return (int) syscall(SYS_flock, fd, flags);
}
int main(void)
{
int fd = open("/etc/hosts", O_RDONLY);
int ret = sys_flock(fd, SYS_LOCK_EX);
if (ret) {
errno = -ret;
perror("flock");
return 1;
}
}