【发布时间】:2017-03-15 09:44:35
【问题描述】:
我正在尝试在 Linux 上获得与 Windows 提供的文件锁定语义接近的文件锁定语义,目的是在缓存文件由单独的进程打开时不删除它们。我的程序创建了各种临时缓存文件,我想在它关闭时删除它们,但是多个实例可能同时运行,我不想删除另一个实例正在使用的文件,因为它会破坏语义 - 缓存文件在各个点按名称打开,如果删除,它将中断。我知道 Linux 在关闭所有打开的句柄之前不会物理删除文件,但我仍然需要按名称打开它。
每个文件的名称唯一标识内容,即我知道如果我需要数据X,它在名为hash(X)的缓存文件中,因此当前实例是否是创建它的实例无关紧要,或者如果我正在重用由另一个实例创建的文件。显然它不完全是数据的哈希值,因为如果我有数据,我就不需要缓存文件,但足以说明重用缓存文件是我想要的。
我的问题是我还没有找到一种在打开文件后用flock 锁定文件的无竞争方式。在这两个调用之间,另一个进程可能会完成并运行缓存清理操作,该操作会删除我刚刚创建的文件。我不需要像在 Windows 上那样强制锁定,因为它只是我的程序访问这些文件,但我确实需要一种方法来防止实例相互踩踏。
编辑:我正在使用 C。
【问题讨论】:
-
您没有说明语言/环境?也许使用计数信号量。
-
看mtime和ctime;如果您避免删除在过去一分钟内创建或修改的文件,您就可以了。或者过去的一天。
-
这是非常特定于 Linux 的,但已知可以在类似的情况下工作。安装
SIGIO处理程序(空函数很好),并使用fcntl(fileno(handle), F_SETLEASE, F_WRLCK)对文件进行写租约。只有当文件未被任何其他进程打开时,它才会成功。 (这确实要求该文件由与正在运行的进程相同的用户拥有,或者该进程以超级用户权限运行。)如果您确实获得了文件租约,unlink()/remove()文件名和@987654326 @;否则只是fclose(handle)。
标签: c linux file-locking