fcntl&x27;s F_GETLK不返回锁详细信息

fcntl&x27;s F_GETLK不返回锁详细信息,c,linux,unix,locking,fcntl,C,Linux,Unix,Locking,Fcntl,我使用fcntl的F_SETLKW获取读取锁,然后尝试使用fcntl的F_GETLK从同一进程读取相同的锁。但结果并不恰当。下面是示例代码 #include <stdio.h> #include <string.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char **argv) { int fd; struct flock fl; if (

我使用fcntl的F_SETLKW获取读取锁,然后尝试使用fcntl的F_GETLK从同一进程读取相同的锁。但结果并不恰当。下面是示例代码

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int fd;
    struct flock fl;

    if ( (fd = open("lockfile", O_RDWR)) == -1 ) {
        perror("open");
        return 1;
    }

    memset(&fl, 0, sizeof(struct flock));
    fl.l_type   = F_RDLCK;  // Read lock
    fl.l_start  = 10;       // lock on offset 2
    fl.l_len    = 1;        // lock length
    fl.l_whence = 0;        // lock value from start

    if ( fcntl(fd, F_SETLKW, &fl) == -1 )
    {
        perror("fcntl:SETLK");
        return 1;
    }
    printf("Read Lock successfull\n");

    if ( fcntl(fd, F_GETLK, &fl) == -1 )
    {
        perror("fcntl:GETLK");
        return 1;
    }

    printf("%d %d %d\n", F_RDLCK, F_WRLCK, F_UNLCK);
    printf("Lock Type   : %d\n", fl.l_type);
    printf("Lock pid    : %d\n", fl.l_pid);
    printf("Lock offset : %d\n", fl.l_start);

    close(fd);

    return 0;
}

它返回的锁类型为2(F_UNLCK),并且不返回获取锁的进程的pid。

F_GETLCK将在没有阻止创建其他锁的情况下将fl.l_类型更改为F_UNLCK。由于您的fl是F_-RDLCK,那么在调用fcntl()F_-GETLCK后不会出现任何错误,并将锁类型更改为F_-UNLCK

,但我检查了F_-WRLCK的相同代码,它也会返回与about相同的结果,并且不会给出pid。基本上,您不会得到任何错误,因为您在同一进程中运行,因此它会将当前锁替换为新锁,这里有一些关于锁定的参考资料,第487页有详细信息,我目前正在学习,希望我没有弄错:)谢谢你的链接。我拿了F_WRLCK,然后我用F_GETLK阅读,然后它必须返回F_WRLCK,而不是返回F_unck。因此,根据该书作者的说法,如果不存在锁,则将设置F_UNLCK。但一开始我拿了锁。请澄清这一点,张贴的代码不干净编译。建议在编译时始终启用所有警告,然后修复这些警告。(对于gcc,至少使用:
-Wall-Wextra-pedantic
Read Lock successfull
0 1 2
Lock Type   : 2
Lock pid    : 0
Lock offset : 10