C - FCNTL F_GETLK 总是返回F_UNLCK



>我正在尝试理解 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 的锁定类型

相关内容

  • 没有找到相关文章

最新更新