Unix 式的部分文件锁定机制

Unix 式的部分文件锁定机制

Linux 和 AFAIK 大多数 UNIX 都会公开flock强制文件锁定的系统调用。诚然,我的经验有限,但我得知它是内核在整个资源上强制执行的。但是,如果我只想强制锁定文件的一部分,以便允许对该资源进行读/写,只要它们不跨越特定边界或在到达锁定区域的外部边界后停止读取,该怎么办。这可能吗?

编辑:可能的实施

咨询部分锁定的可能性可以通过 MMaped 区域来实现,其中内存被映射到每个读取器的地址空间,前提是所请求的区域不持有锁。这将完全在用户空间中实现,因此失去了内核强制锁定的优势,但肯定会起作用

答案1

您可以使用以下方法获取部分锁fcntl(2)F_SETLKF_SETLKW或命令宏进行系统调用,并通过作为第三个参数提供的结构F_GETLK提供要锁定的部分区域。flock

F_SETLKF_SETLKW、 和F_GETLK用于获取、释放和测试记录锁(也称为字节范围锁、文件段锁或文件区域锁)是否存在。第三个参数 lock 是一个指向结构的指针,该结构至少具有以下字段(按未指定的顺序)。

struct flock {
    ...
    short l_type;    /* Type of lock: F_RDLCK,
                        F_WRLCK, F_UNLCK */
    short l_whence;  /* How to interpret l_start:
                        SEEK_SET, SEEK_CUR, SEEK_END */
    off_t l_start;   /* Starting offset for lock */
    off_t l_len;     /* Number of bytes to lock */
    pid_t l_pid;     /* PID of process blocking our lock
                        (set by F_GETLK and F_OFD_GETLK) */
    ...
};

该结构的l_whencel_startl_len字段指定我们希望锁定的字节范围。 文件末尾之后的字节可能会被锁定,但文件开头之前的字节不会被锁定。

相关内容