c - 在 Linux 和 OS/X 上模拟 Windows 风格的文件锁定

标签 c linux file-locking

<分区>

我正在尝试在 Linux 上获得接近于 Windows 提供的文件锁定语义,目的是在缓存文件由单独的进程打开时不删除它们。我的程序创建了各种我想在关闭时删除的临时缓存文件,但是多个实例可能同时运行并且我不想删除另一个实例正在使用的文件,因为它会破坏语义 - 缓存文件在不同点按名称打开,如果删除,将会中断。我知道 Linux 在关闭所有打开的句柄之前不会物理删除文件,但我仍然需要按名称打开它。

每个文件的名称唯一标识内容,即我知道如果我需要数据 X,它在名为 hash(X) 的缓存文件中,因此当前实例是否是创建它的实例并不重要,或者如果我正在重用另一个实例创建的文件。显然它不完全是数据的哈希,因为如果我有数据,我就不需要缓存文件,但足以说明重用缓存文件是我想要的。

我的问题是我还没有找到一种在打开文件后用 flock 锁定文件的无竞争方式。在这两个调用之间,另一个进程可能会完成并运行删除我刚刚创建的文件的缓存清理操作。我不需要像在 Windows 上那样强制锁定,因为只有我的程序访问这些文件,但我确实需要一种方法来防止实例相互踩踏。

编辑:我正在使用 C。

最佳答案

I don't want to delete a file that's in use by another instance

不能删除另一个进程(甚至是同一个进程)使用的文件。您可以删除指向该文件的目录条目(或者更确切地说是 a 目录条目,因为可能有多个目录条目),但文件本身将保持事件状态,只要它被 保持打开状态em>任何进程。 Linux 中的文件是引用计数的,这就是它的工作原理。

一种通过名称协作“锁定”文件的简单方法是:

    char new_filename[FILENAME_SIZE] = "busy_";
    link (filename, strcat(new_filename, filename));
    fd = open(new_filename, "r");
    if (fd) {
        ......
        close (fd);
    }
    unlink (new_filename);

检查链接的结果。如果每个人都这样做来打开文件,并且清理只取消链接原始名称,那么您就设置好了。

关于c - 在 Linux 和 OS/X 上模拟 Windows 风格的文件锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42806053/

相关文章:

c - 那会错吗?如果是这样,为什么会这样?输出为2500

c - C中获取文件的绝对路径

linux - 为什么当后台进程以状态 1 退出时,后台进程会强制父进程退出?

linux - 在哪里可以找到 opengl 的 S3TC 压缩纹理?

delphi - 日志文件监视器

Linux flock,如何锁定 "just"文件?

c - fread 导致段错误

objective-c - objc_msgSend 15 崩溃

c++ - 在 Linux(Ubuntu 13.10 和 14.04)下运行没​​有 QtCoreApplication/QCoreApplication 的 Qt C++ 代码

Perl:flock() 在 Linux 上运行,忽略之前在 AIX 上的锁定