fcntl的F_GETLK没有返回锁定细节

时间:2015-10-28 12:25:52

标签: 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 ( (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;
}

结果:

Read Lock successfull
0 1 2
Lock Type   : 2
Lock pid    : 0
Lock offset : 10

它将锁定类型返回为2(F_UNLCK)并且它不返回进行锁定的进程的pid。

1 个答案:

答案 0 :(得分:1)

如果没有阻止其他人被创建的锁定,F_GETLCK会将fl.l_type更改为F_UNLCK。由于你的fl是F_RDLCK,所以在调用fcntl()后,F_GETLCK不会得到任何错误并将锁类型更改为F_UNLCK