【问题标题】:locking a file using lockf in C is not working在 C 中使用 lockf 锁定文件不起作用
【发布时间】:2015-05-06 13:38:23
【问题描述】:

平台:ubuntu 14.4

gcc 版本:4.8.2

语言:C

情况:

我有两个文件来测试lockf的功能,一个是写,一个是读。

在写入时目标文件应该被锁定,从而禁止读取打开同一个文件。

问题:

当我运行写程序时,我只是让它等待用户输入并启动读程序。不知何故,读取能够获取目标文件中的信息。这意味着 write 中的 lockf 没有正确锁定它。为什么我失败了?

代码:

read.c

int main()
{
    char buffer[4];
    char *filename = "/home/fikrie/Documents/test_lockf/file.txt";
    int fd;

    fd = open(filename, O_RDONLY, 0644);
    lockf(fd, F_LOCK, 3);
    while (1) {
            if (read(fd, buffer, 3) == -1) {
                    printf("Error getting file");
                    break;
            } else {
                    printf("%s",buffer);
                    getchar();
            }
    }
    close(fd);
    lockf(fd, F_ULOCK, 0);

    return 0;
}

写.c

int main()
{
    char buffer;
    char *filename = "/home/fikrie/Documents/test_lockf/file.txt";
    int fd;

    fd = open(filename, O_WRONLY | O_APPEND, 0644);
    lockf(fd, F_LOCK, 3);
    while(1) {
            buffer = getchar();
            if (buffer != 'q') {
                    write(fd,"ABC",3);
                    write(fd,":",1);
            }
            else {
                    break;
            }
    }
    close(fd);
    lockf(fd, F_ULOCK, 0);

    return 0;
}

等:

从手册页,

lockf(int fd, int function, off_t size);

size 参数是要锁定或解锁的连续字节数。要锁定或解锁的部分从文件中的当前偏移量开始,向前扩展为正大小或向后扩展为负大小。

我以为我为 size 参数传递了错误的值,所以我也尝试传递 0。但结果是一样的。

【问题讨论】:

  • 您确定lockf() 成功了吗?您忽略了它的返回值,这通常是一个坏主意。另外,你为什么在O_RDONLY 模式下用三个参数调用open()?那是不对的。在假设它成功之前,您应该检查 open() 是否也成功。
  • @unwind。你说的对。如果没有检查 lockf 的返回值,我就假设得太早了。感谢您的指导。读取的返回值为-1。哪个是对的。我假设它是因为我得到了文件中的值。对不起我的错误。

标签: c lockfile


【解决方案1】:

Lockf 命令要求文件描述符是可写的,F_LOCK 版本才能成功。

来自手册页:

错误
EBADF fd 不是打开的文件描述符;或者 cmd 是 F_LOCK 或 F_TLOCK 并且 fd 不是可写文件描述符。

PS:@unwind,完全正确,检查错误代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多