【问题标题】:fcntl's F_GETLK not returning lock detailsfcntl 的 F_GETLK 不返回锁定详细信息
【发布时间】:2015-10-28 12:25:52
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 发布的代码没有完全编译。建议在编译时始终启用所有警告,然后修复这些警告。 (对于 gcc,至少使用:-Wall -Wextra -pedantic

标签: c linux unix locking fcntl


【解决方案1】:

如果没有阻止创建其他锁的锁,F_GETLCK 会将 fl.l_type 更改为 F_UNLCK。既然你的fl是F_RDLCK,那么调用fcntl() F_GETLCK就不会报错,锁类型改成F_UNLCK

【讨论】:

  • 但我检查了 F_WRLCK 的相同代码,它也返回与 about 相同的结果,并且没有给出 pid。
  • 基本上你不会得到任何错误,因为你在同一个进程中运行,所以它会将当前锁替换为新锁,这里有一些关于锁定link的参考在第487页有详细信息,我目前正在学习这个,所以希望我没有弄错:)
  • 感谢您的链接。我拿了 F_WRLCK 然后我正在使用 F_GETLK 阅读然后它必须返回 F_WRLCK 而不是它返回 F_UNLCK。因此,根据本书作者的说法,如果不存在锁,将设置 F_UNLCK。但我最初锁定了。请澄清这一点
猜你喜欢
  • 2015-05-16
  • 2017-08-10
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2018-11-10
  • 2014-07-17
  • 2012-06-30
  • 2016-10-27
相关资源
最近更新 更多