c++ - 在 Linux 中对只读文件设置排他锁

标签 c++ linux ipc mutex

假使,假设:

  • 1) 我在 Linux 上有一个文件夹,我只有“读取”和“执行”权限。
  • 2)具有更高权限(具有“写入”权限)的人会将一些文件放入该文件夹中。
  • 3)并行运行的程序的多个进程将读取文件并对其进行一些数据处理。

  • 需求:一个文件只被一个进程读取。完成后,文件将被删除或移动到其他位置。不会写入/编辑所有文件。例如,我有 5 个文件和 2 个并行运行的进程。我需要确保进程 1 将读取文件 1、3 和 5 上的一些工作。进程 2 将读取文件 2 和 4 上的一些工作。这意味着计算分布是在文件级别完成的。我们不会在文件中分配计算。

    在 Linux 上,有两个函数可以放置排他锁:flockfcntl .他们可以互换工作并尊重其他人放置的锁。问题是这两个函数都需要“写”权限。

    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/

    相关文章:

    c - 打开命名管道的顺序导致可能的竞争条件?

    C++ 构造函数实现错误

    linux - (Bluez) 如何获取蓝牙耳机按键输入?

    php - 使用 pecl 在 linux 上为 lampp 设置 memcached

    c - 执行开始时出现段错误

    Android:两个独立APK的两个服务之间的通信

    c++ - 在 C++ 中求值是什么意思?

    c++ - 对原子操作的最低要求

    c++ - 我如何杀死弹出窗口?

    python - ImportError: libcblas.so.3: 无法打开共享对象文件: 没有那个文件或目录