跳到内容

便携式文件锁定

在文件上放置独占或共享锁。它使用锁定文件在Windows和文件锁类Unix系统上的锁。

安装

照常从CRAN安装组件:

安装.包(“文件锁定”)

从GitHub安装开发版本:

巴基斯坦::巴基斯坦(“r-lib/filelock”)

用法

这是R进程1,它获得了一个独占锁。如果要锁定文件我的文件,始终创建一个单独的锁文件,而不是直接将锁放置在此文件上!

R1级> lck公司 <- (“/tmp/myfile.lck”)

这是R进程2,它无法获取锁。

R2级> (“/tmp/myfile.lck”,超时= 0)

在放弃之前指定超时间隔:

R2级> (“/tmp/myfile.lck”,超时= 5000)

无限期等待:

R2级> (“/tmp/myfile.lck”,超时= Inf公司)

一旦R进程1释放锁(或终止),R进程2就可以获取锁:

R1级> 解锁(lck公司)
R2级> (“/tmp/myfile.lck”)
#>锁定“/tmp/myfile.lck”

文档

警告

始终使用特殊文件进行锁定。也就是说,如果你想限制对某个文件的访问把锁放在这个文件上。创建特殊文件,例如通过附加.锁定更改为原始文件名并将其锁定。锁定()实际上,如果文件不存在,函数会为您创建该文件。)读取或写入锁定文件的行为未定义!(详见下文堆内构件部分。)

很难确定删除这些特殊文件是否安全以及何时安全,因此我们当前的建议是保留它们。

最好将特殊的锁文件保留为空,因为在某些操作系统上,一旦锁定到位,就无法对其进行写入(或读取)。

咨询锁:

此包设置的所有锁可能都是建议性的。不遵守此锁定机制的进程可能能够读取和写入锁定的文件,甚至可以删除它(假设它有能力这样做)。

终止时解锁:

如果进程终止(正常退出、崩溃或收到信号),它持有的锁将自动释放。

如果表示锁的R对象()超出范围,那么一旦对象被垃圾收集,锁就会自动释放。这更像是一种安全机制,用户仍然应该解锁()手动锁定,可能使用基::on.exit(),以便在出现错误时尽快释放锁。

特殊文件系统:

文件锁定需要文件系统的支持非标准的文件系统不支持它。例如,在NFS或CIFS等网络文件系统上sshfs文件英尺/平方英尺等,支持可能会有所不同。如果启用,则最新的Linux版本和最新的NFS版本(从版本3开始)确实支持文件锁定。

理论上,可以使用两个子进程和一个超时来简单测试锁支持,但文件锁定目前没有这样做。

锁定文件的一部分:

虽然这通常是可能的,文件锁定目前不支持。主要目的是文件锁定是使用特殊的锁定文件进行锁定,其中的锁定部分实际上并不有用。

Unix上的内部组件:

在Unix(即Linux、macOS等)上,我们使用文件锁以获取和释放锁。您可以在此处阅读更多信息:https://www.gnu.org/software/libc/manual/html_node/File-Locks.html

一些要点:

  • 锁放在文件描述符上,文件描述符保持打开状态,直到释放锁。
  • 一个进程只能为给定文件设置一种锁。
  • 当进程关闭该文件的任何文件描述符时,进程对该文件持有的所有锁都会被释放,即使这些锁是使用其他保持打开的描述符创建的。注意,在R中,使用一次函数调用修改文件会打开和关闭一个文件描述符,因此锁将被释放。(这是使用特殊锁文件而不是将锁放在实际文件上的主要原因之一。)
  • 使用fork创建的子进程不会继承锁。
  • 对于具有有限超时间隔的锁请求,我们设置了一个警报,并临时为其安装一个信号处理程序。R是单线程的,因此在进程等待获取锁时,其他代码无法运行。获取锁或超时后,信号处理程序立即恢复为其原始值。(它实际上是从信号处理程序恢复的,因此这里应该没有竞争条件。但是,如果西加勒姆信号通过对信号处理程序的单个调用传递,然后警报可能会丢失。当前基本R不使用西加勒姆发出任何信号,但其他包可能会发出。)

Windows上的内部组件:

在Windows上,锁定文件Ex用于在文件上创建锁。如果为锁定请求指定了有限超时,则使用异步(重叠)I/O来等待超时的锁定事件。查看有关的更多信息锁定文件Ex第一次点击这里:https://msdn.microsoft.com/en-us/library/aa365203.aspx

一些要点:

  • 锁定文件Ex锁是必需的(与咨询相反),因此实际上没有其他进程可以访问锁定的文件。实际上,即使是锁定进程也无法通过与用于锁定的文件句柄不同的文件句柄访问它。一般情况下,R无法从锁定的文件中读取,也无法向其写入。(尽管当前的R版本没有失败,但它什么都不做,这很令人困惑。)请记住,始终使用特殊的锁定文件,而不是将锁定放在主文件上,这样您就不会受到这些问题的影响。
  • 继承的句柄不提供对子进程的访问权限。

行为准则

请注意,fs项目发布时带有贡献者行为准则。通过参与此项目,您同意遵守其条款。

许可证

麻省理工学院©RStudio