gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:25:14 25 4
gpt4 key购买 nike

假使,假设:

  • 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com