在Linux和OS / X上模拟Windows样式的文件锁定

时间:2017-03-15 09:44:35

标签: c linux file-locking

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

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

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

编辑:我正在使用C。

1 个答案:

答案 0 :(得分:0)

  

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

无法删除其他进程(甚至同一进程)使用的文件。您可以删除指向该文件的目录条目(或者更确切地说是 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的结果。如果每个人都这样打开一个文件,并且清理只取消链接原始名称,那么你就被设置了。