我正在使用Python的
filelock
模块。
在Windows上,当锁被释放时,支持它的文件会被删除。
在UNIX上,即使锁被释放,锁文件仍然存在于文件系统中。
filelock
模块。
在Windows上,当锁被释放时,支持它的文件会被删除。
在UNIX上,即使锁被释放,锁文件仍然存在于文件系统中。
py-filelock
的具体说明filelock
库曾在UNIX系统上删除锁文件;但随着benediktschmitt/py-filelock#31
和flock(): removing locked file without race condition?的出现,这种行为已被移除。后者讨论了本回答中后面部分描述的相同竞争条件。
由于操作系统语义不同,因此在每种情况下都需要采用不同的方法。在UNIX中,即使有句柄打开,也可以删除文件,因此不应删除锁文件,否则两个程序都可能认为自己持有相同的锁,当实际上他们持有完全不同的inode,在不同的时间点下被引用为同一文件名下的内容。
相比之下,Windows上默认的文件系统语义使得在任何程序打开文件时都无法删除该文件(尽管NTFS足够强大以支持这样做,但它被人为地阻止以向后兼容到围绕FAT限制设计的程序),因此在Windows上删除锁文件是安全的:如果删除成功,那就证明没有人持有该锁(甚至没有在打开文件以后获取该锁的过程中)。
为了举例说明UNIX允许打开的文件被取消链接如何使得删除锁文件变得危险,考虑以下常见竞争条件的示例:
unlink()
系统调用删除锁定文件。(在UNIX上为了安全起见,可以省略此步骤)。这不会删除文件本身(“inode”),直到没有任何程序打开它,但它确实立即从先前包含它的目录中删除了指向该文件的链接。因此,以上说明了如何在UNIX上通过删除锁文件允许竞态条件,在这种情况下,锁可能看起来被两个程序同时持有。