Linux 和 AFAIK 大多数 UNIX 都会公开flock
强制文件锁定的系统调用。诚然,我的经验有限,但我得知它是内核在整个资源上强制执行的。但是,如果我只想强制锁定文件的一部分,以便允许对该资源进行读/写,只要它们不跨越特定边界或在到达锁定区域的外部边界后停止读取,该怎么办。这可能吗?
编辑:可能的实施
咨询部分锁定的可能性可以通过 MMaped 区域来实现,其中内存被映射到每个读取器的地址空间,前提是所请求的区域不持有锁。这将完全在用户空间中实现,因此失去了内核强制锁定的优势,但肯定会起作用
答案1
您可以使用以下方法获取部分锁fcntl(2)
由F_SETLK
、F_SETLKW
或命令宏进行系统调用,并通过作为第三个参数提供的结构F_GETLK
提供要锁定的部分区域。flock
F_SETLK
、F_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_whence
、l_start
和l_len
字段指定我们希望锁定的字节范围。 文件末尾之后的字节可能会被锁定,但文件开头之前的字节不会被锁定。