我试图理解C中的POSIX文件区域锁。下面的程序非常简单,将锁设置为F_WRLCK,然后获取锁打开/设置锁时没有错误不幸的是,它总是返回Fúunck哪里出错了有没有可能它在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 %i\n", 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
。
因为调用过程是创建这些现有锁的一个进程,所以它也可以创建这个新锁。
说
F_GETLK
获取第一个锁,该锁阻止第三个参数arg指向的锁描述,
用作指向结构群的指针(见上文)检索到的信息覆盖
在羊群结构中传递给fcntl的信息如果找不到可以阻止
此锁创建时,此函数调用将保持结构不变,但
对于设置为
F_UNLCK
的锁类型。关于c - fcntl F_GETLK始终返回F_UNLCK,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42884876/