假使,假设:
需求:一个文件只被一个进程读取。完成后,文件将被删除或移动到其他位置。不会写入/编辑所有文件。例如,我有 5 个文件和 2 个并行运行的进程。我需要确保进程 1 将读取文件 1、3 和 5 上的一些工作。进程 2 将读取文件 2 和 4 上的一些工作。这意味着计算分布是在文件级别完成的。我们不会在文件中分配计算。
在 Linux 上,有两个函数可以放置排他锁:flock和 fcntl .他们可以互换工作并尊重其他人放置的锁。问题是这两个函数都需要“写”权限。
Boost 库也有
boost::interprocess::file_lock::try_lock()
功能。它的作用与上述两个功能相同。它还需要“写”权限。有没有其他方法可以对我没有“写”权限的文件设置排他锁?
最佳答案
Any access (读或写)对于 Linux 就足够了 flock
系统调用来锁定文件,不像 fcntl
锁哪个requires读锁的读访问和写锁的写访问。
您可能正在使用模拟 flock
的 libc顶部 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;
}
}
关于c++ - 在 Linux 中对只读文件设置排他锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62442065/