当前位置: 首页 > 面试题库 >

Linux上的flock vs lockf

东方国安
2023-03-14
问题内容

如果lockf以0偏移量使用,则在排他模式下使用时flocklockf使用时有什么区别?

我之所以问是因为我正在阅读基于平台有条件地在这两个函数中的任何一个中编译的代码,所以我想了解原因。


问题答案:

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

您正在使用的库仅具有根据当前平台选择所需语义的逻辑

如果语义(行为优于描述符传递,派生等)是可以接受的,则在Linux中,您应该更喜欢lockf()/
fcntl()locks而不是flock()锁,这仅仅是因为前者适用于NFS等文件系统,而后者则不行。(在BSD和Mac OS
X上,我相信您需要显式使用fcntl()来代替。)

在Linux中,lockf()它只是的包装fcntl(),而flock()锁是分开的(并且仅适用于本地文件系统,不适用于2.6.12之前的内核上的NFS挂载)。也就是说,一个进程可以flock()在文件上具有咨询排他锁,而另一个进程可以fcntl()在同一文件上具有咨询排他锁。两者都是咨询锁,但它们不交互。

在Mac OS
X
和FreeBSD上,lockf()/
flock()/
fcntl()锁定全部交互,尽管建议开发人员仅使用应用程序中的一种接口。但是,只有fcntl()锁才能在NFS挂载上工作(并且很明显,只有将NFS客户端和服务器都配置为支持记录锁,这在Web托管环境中很少见;这是某些Web(框架)开发人员头痛的巨大原因)
)。

POSIX没有明确规定如何lockf()/ flock()/ fcntl()锁应该互动,也有过在过去的分歧。现在,情况有所缓解, 大约
可以说

  1. fcntl() 锁是最可靠的

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

  1. 通常,它lockf()被实现为“简写”fcntl()

另一种选择,如的“简写” flock()是可能的,但如今很少见。

  1. fcntl()并且flock()具有不同的语义 继承和自动发布

fcntl()锁在上保留exec(),但在上不继承fork()。当拥有过程关闭引用同一文件的 任何 描述符时,将释放这些锁。

在Linux,FreeBSD和MAc OS X中,flock()锁与打开的文件描述符结合在一起:传递描述符也传递锁。(手册页指出
“该锁在文件上,而不在文件描述符上 。”这并不矛盾。这仅表示该锁 适用
于文件。它仍以这种方式耦合到描述符因此,如果多个进程flock()flock()调用后从发起者那里获取了描述符,则多个进程可能同时在同一文件上具有相同的排他咨询锁。

文件锁定是令人惊讶的复杂问题。我个人仅坚持fcntl()锁定即可获得最佳结果。语义wrt。fcntl()锁不是最容易使用的锁,在某些情况下,坦率地说,这很令人生气;只是我发现它可以产生最佳-
最可靠,最便携,最不令人惊讶的结果。



 类似资料:
  • 问题内容: 我是新手,已经开始学习Python,但是我有一些我听不懂的问题, PYTHONPATH(在Ubuntu上)究竟是什么?是文件夹吗? 是Ubuntu上默认提供的Python,还是必须显式安装? 所有模块所在的文件夹在哪里(我有很多文件夹称为)? 如果我希望在编程时能使用一个新模块(例如pyopengl),应该在哪里介绍下载的文件夹中的所有文件夹? 回到PYTHONPATH问题,如何配置P

  • 问题内容: 我正在使用Mono和Monodevelop在Linux(KUbuntu)中进行项目。我想使用System.Speech库,在Windows 7上的Unity中,Monodevelop完全可以使用该库。在过去的几个小时里,我一直在网上寻找很多东西,据我所知,System.Speech WAS已添加到单核细胞增多症。 我已经更新了所有mono,显示了4.0.2(最新版本),而Monodev

  • 1.5. RedHat Linux 上的 Python 如果您想在像 Linux 一样的 UNIX 兼容的操作系统上安装二进制包很容易。 预编译好的二进制包对大多数 Linux 发行版是可用的。或者您可以通过源码进行编译。 在 http://www.python.org/ftp/python/ 选择列出的最新的版本号, 然后选择 其中的rpms/ 目录下载最新的 Python RPM 。 使用 r

  • 问题内容: 我正在寻找Linux上的等效工具。 目前,我正在使用Python的,它大概会调用。我担心的是,如果时钟混乱,例如NTP,返回的时间(UNIX纪元)可能会发生不规则的变化。一个简单的过程或系统挂墙时间,仅以恒定的速率正增加就足够了。 在C或Python中是否存在任何此类时间函数? 问题答案: 您可以在C中使用CLOCK_MONOTONIC,例如:

  • 问题内容: 说我已经生成了以下二进制文件: 并说,我想使用类似grep的语法查找全零()的位置。 到目前为止,我能做的最好的事情是: 但是,这会将原始二进制文件中的每个字节隐式转换为多字节ASCII表示形式,并可以对其进行操作;不完全是优化的主要示例:) 是否有类似Linux 的二进制文件?也可能支持某种类似于正则表达式的语法,但也支持字节“字符”的东西-也就是说,我可以编写类似“ ”的东西,并在

  • 问题内容: 在* nix上分析C / C ++应用程序的最佳工具是什么? (我希望配置一个服务器,该服务器混合了(阻止)文件IO,用于网络的epoll和fork()/ execv()来进行一些繁重的工作;但是也欢迎一般帮助和更通用的工具。) 您是否可以将RAM,CPU,网络和磁盘的大系统图统统归纳并深入研究? 关于内核之类的东西,在内核列表上有很多话题,但是我还没有在Ubuntu中发现任何东西。