If lockf
与 0 偏移量一起使用,两者之间有什么区别flock
and lockf
当在独占模式下使用时,如果有的话?
我这么问是因为我正在阅读根据平台有条件地在这两个函数中进行编译的代码,并且我想了解可能的原因。
之间的实际区别flock()
and lockf()
存在于语义(有关关闭和传递的行为)、NFS 和其他共享文件系统上的适用性,以及咨询锁是否对其他进程可见fcntl()
锁与否。
您使用的库仅具有根据当前平台选择所需语义的逻辑。
如果语义(描述符传递、分叉等行为)可以接受,您应该更喜欢lockf()
/fcntl()
锁定flock()
Linux 中的锁定,仅仅是因为前者可以在 NFS 等文件系统上运行,而后者则不能。 (在 BSD 和 Mac OS X 上,我相信您需要明确使用fcntl()
, 反而。)
在Linux中,lockf() http://linux.die.net/man/3/lockf只是一个包装fcntl() http://man7.org/linux/man-pages/man2/fcntl.2.html, while flock() http://man7.org/linux/man-pages/man2/flock.2.html锁是独立的(并且仅适用于本地文件系统,不适用于 2.6.12 之前内核上的 NFS 安装)。也就是说,一个进程可以拥有一个独占的咨询flock()
锁定一个文件,而另一个进程具有咨询独占fcntl()
锁定同一个文件。两者都是咨询锁,但它们不交互。
On Mac OS X https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man3/lockf.3.html and , lockf()
/flock()
/fcntl()
锁定所有交互,尽管建议开发人员在应用程序中仅使用其中一个接口。然而,仅fcntl()
锁工作正常(而且,显然,只有 NFS 客户端和服务器都配置为支持记录锁,这在 Web 托管环境中非常罕见;这对一些 Web(框架)开发人员来说是一个令人头疼的问题)。
POSIX 没有明确指定如何lockf()
/flock()
/fcntl()
锁应该是交互的,过去一直存在差异。现在局势稍微平静了一些,可以大约比如说
-
fcntl()
锁是最可靠的
在各种架构中,它们最有可能在诸如以下方面正常工作:共享文件系统——例如 NFS 和 CIFS 安装。
-
最经常,lockf()
被实现为“简写”fcntl()
另一种选择,作为“简写”flock()
,是可能的,但现在很少见。
-
fcntl()
and flock()
有不同的语义。继承和自动释放
fcntl()
锁被保留在exec()
,但不继承fork()
。当拥有进程关闭时,锁被释放any引用同一文件的描述符。
在 Linux、FreeBSD 和 MAC OS X 中,flock()
锁与打开的文件描述符结合在一起:传递描述符也传递锁。 (手册页指出“锁位于文件上,而不是文件描述符上”。这并不矛盾。这只是意味着锁applies到文件。它仍然与描述符耦合,这样复制描述符也会传递相同的锁。)因此,多个进程可能具有相同的独占咨询flock()
如果他们在之后从发起者那里获得了描述符,则同时锁定同一个文件flock()
call.
文件锁定是一个非常复杂的问题。我个人通过简单地坚持就获得了最好的结果fcntl()
锁定。语义。fcntl()
锁并不是最容易使用的,并且在某些情况下坦率地说可能会令人恼火;只是我发现它能产生最好的——最可靠的、最便携的、最不令人惊讶的——结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)