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



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

每个文件的名称唯一地标识了内容,即我知道,如果我需要data x,则在名为hash(x)的高速缓存文件中,因此当前实例是否是创建它的实例,或者,如果我要重用另一个实例创建的文件。显然,这并不是数据的哈希,因为如果我有数据,我不需要缓存文件,但是足以说重复使用缓存文件是我想要的。

我的问题是,打开羊群后,我还没有找到一种用羊群锁定文件的方法。在这两个呼叫之间,另一个过程可能会完成并运行删除我刚创建的文件的高速缓存操作。我不需要像Windows上的强制性锁定,因为它只是我的程序访问这些文件,但是我确实需要一种方法来防止实例互相踩踏。

编辑:我正在使用C。

我不想删除另一个实例正在使用的文件

you 无法删除另一个过程使用的文件(甚至相同的过程)。您可以删除指向该文件的目录条目(或更确切地说是 a directiry条目,因为可能有多个),但是只要文件本身保留,只要该文件由<<任何过程。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);

一个人做不是检查link的结果。如果每个人都这样做以打开文件,并且清理仅链接原始名称,则设置了。

最新更新