>我正在尝试理解 C 中的 POSIX 文件区域锁。下面的程序非常简单,将锁设置为F_WRLCK,然后获取锁。打开/设置锁定时没有错误。不幸的是,它总是F_UNLCK回来。错误在哪里?是否有可能在OSX上无法正常工作?
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
void printLockType(int lock) {
if ( lock == F_RDLCK ) {
printf("readlock %i n", lock);
}else if ( lock == F_WRLCK ) {
printf("writelock %i n", lock);
}else if ( lock == F_UNLCK ) {
printf("unlock %i n", lock);
} else {
printf("other %in", lock);
}
}
int main(int argc, char *argv[])
{
int fd;
struct flock fl ,fl2;
fl2.l_type = F_RDLCK; /* read/write lock */
fl2.l_whence = 0; /* beginning of file */
fl2.l_start = 0; /* offset from l_whence */
fl2.l_len = 100; /* length, 0 = to EOF */
fl2.l_pid = getpid();
fl.l_type = F_WRLCK; /* read/write lock */
fl.l_whence = 0; /* beginning of file */
fl.l_start = 0; /* offset from l_whence */
fl.l_len = 1000; /* length, 0 = to EOF */
fl.l_pid = getpid();
if ((fd = open("xxx", O_RDWR)) == -1) {
perror("open");
exit(1);
}
if (fcntl(fd, F_SETLK, &fl) == -1) {
perror("fcntl");
exit(1);
}
if(fcntl(fd, F_GETLK, &fl2) == -1) {
printf("%s n", strerror(errno));
} else {
printLockType(fl2.l_type);
}
return 0;
}
您误解了F_GETLK
查询。当没有任何内容阻止调用进程在给定位置放置给定类型的锁时,它会返回F_UNLCK
。
由于调用进程是创建这些现有锁的进程,因此它也可以创建此新锁。
Mac OS X手册说
F_GETLK
获取阻止第三个参数 arg 指向的锁描述的第一个锁, 作为指向结构群的指针(见上文(。 检索到的信息将覆盖 在群结构中传递给 FCNTL 的信息。如果未找到锁,则会阻止 从创建此锁开始,此函数调用将保持结构不变,除了 对于设置为
F_UNLCK
的锁定类型。