在Linux上的群集vs lockf

如果lockf与0偏移量一起使用,在独占模式下, flocklockf之间有什么区别?

我在问,因为我正在阅读的代码,有条件地编译在这两个基于平台的function之一,我想了解可能的原因。

Solutions Collecting From Web of "在Linux上的群集vs lockf"

flock()lockf()之间的实际区别在于语义(相对于关闭和传递的行为),在NFS和其他共享文件系统上的适用性,以及使用fcntl()锁定的其他进程是否可见。

您正在使用的库只是逻辑来根据当前平台选择所需的语义。

如果语义(通过描述符传递,分叉等行为)是可以接受的,那么你应该更喜欢Linux上flock()锁定的lockf() / fcntl()锁定,因为前者在NFS等文件系统上工作,而后者才不是。 (在BSD和Mac OS X上,我相信你需要明确地使用fcntl() 。)


在Linux中, lockf()只是fcntl()一个包装,而flock()锁是分开的(只能在本地文件系统上工作,而不是在NFS挂载上)。 也就是说,一个进程可以在一个文件上有一个独立的flock()锁,而另一个进程在同一个文件上有一个独立的fcntl()锁。 两者都是咨询锁,但不会互动。

在Mac OS X和FreeBSD上 , lockf() / flock() / fcntl()锁定所有交互,尽管开发人员建议仅使用应用程序中的一个接口。 然而,只有fcntl()锁在NFS挂载上工作(显然,只有当NFS客户端和服务器都被配置为支持记录锁定时,这在例如web托管环境中是罕见的;对于一些web框架)开发人员)。

POSIX没有明确指定lockf() / flock() / fcntl()锁应该如何交互,并且在过去有过不同之处。 现在情况已经平静了一点, 大概可以这样说

  1. fcntl()锁是最可靠的

    在不同的体系结构中,例如,它们具有在共享文件系统上工作的最佳机会 – NFS和CIFS挂载。

  2. 大多数情况下, lockf()被实现为fcntl() “简写”

    另一种选择,作为flock() “速记”是可能的,但现在很少见。

  3. fcntl()flock()具有不同的语义wrt。 继承和自动发布

    fcntl()锁保存在exec() ,但不能通过fork()继承。 当拥有进程关闭引用同一文件的任何描述符时,锁被释放。

    在Linux,FreeBSD和MAc OS X中, flock()锁与打开的文件描述符结合在一起:传递描述符也传递锁。 (手册页声明“锁在文件上,而不在文件描述符上” ,这并不矛盾,只是意味着锁适用于文件,它仍然与描述符耦合,这样那么复制描述符也会传递相同的锁。)因此,如果多个进程在同一个文件上同时拥有相同的排他咨询flock() ,如果他们在flock()之后从发起者获得了描述符flock()调用。

文件锁定是令人惊讶的复杂问题。 通过简单地坚持fcntl()锁定,我个人得到了最好的结果。 语义wrt。 fcntl()锁不是最简单的工作,在某些情况下可以坦率地激怒; 只是我发现它产生了最可靠,最便携,最不令人惊讶的结果。

条件编译最可能的原因是两个函数在每个平台上都不可用。