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

fcntl,lockf,哪个更适合用于文件锁定?

年嘉禧
2023-03-14
问题内容

寻找有关 fcntl lockf优点缺点
的信息以进行文件锁定。例如,哪个更适合用于便携性?我目前正在编写linux守护程序,并想知道哪种守护程序更适合用于执行互斥。 __ __


问题答案:

lockf和fcntl有什么区别:

在许多系统上,lockf()库例程只是的包装fcntl()。也就是说,lockf提供了该功能的子集fcntl

资源

但是,在某些系统上,fcntl并且lockf锁是完全独立的。

资源

由于它取决于实现,因此请确保始终使用相同的约定。因此,要么总是在两个进程中都使用lockf,要么总是使用fcntl。它们很可能会互换,但是使用相同的对象更安全

选择哪一个都没关系。

关于强制锁和咨询锁的一些说明:

在UNIX锁定/ linux是默认 咨询
,意味着其他进程并不需要遵循所设置的锁定规则。因此,只要您的协作过程也使用相同的约定,锁定哪种方式都没有关系。

Linux确实支持 强制 锁定,但前提是您的文件系统在选项为on且文件特殊属性已设置的情况下挂载。您可以使用mount -o mand挂载文件系统并设置文件属性g-x,g+s以启用强制性锁定,然后使用fcntllockf。有关强制锁如何工作的更多信息,请参见此处。

请注意,锁并不应用于单个文件,而是应用于索引节点。这意味着指向相同文件数据的2个文件名将共享相同的锁定状态。

另一方面,在Windows中,您可以主动以独占方式打开文件,这将阻止其他进程完全打开该文件。即使他们想要。即,锁是强制性的。Windows和文件锁也是如此。具有打开的文件句柄且具有适当访问权限的任何进程都可以锁定文件的一部分,并且其他进程将无法访问该部分。

强制锁如何在Linux中工作:

关于强制性锁,如果某个进程使用读取锁锁定文件的某个区域,则其他进程将被允许读取但不能写入该区域。如果某个进程使用写锁定锁定文件的区域,则不允许其他进程读取或写入该文件。不允许进程访问文件部分时,会发生什么情况取决于您是否指定O_NONBLOCK。如果设置了阻止,它将等待执行该操作。如果未设置阻止,则将收到错误代码EAGAIN

NFS警告:

如果在NFS挂载上使用锁定命令,请小心。该行为是不确定的,并且实现是广泛变化的,是仅使用本地锁定还是支持远程锁定。



 类似资料:
  • 使用、或侦听和更改的可见性,是否有一些规则或好/坏的经验? 其中一个比其他的更好或更安全吗?我特别想知道/隐藏的时间和方式。 请注意,以下代码包含不正确的Swing规则,例如使用,在本例中,允许我在Swing GUI中打印出正确顺序的

  • 让我们讨论以下主题。有一个应用程序目前正在使用熟悉的xcopy方法部署。这种方法很难管理依赖项、文件更新等。有一种想法是,在一些包的帮助下开始应用程序部署,就像在Linux中借助RPM一样,但对于Windows。 所以我有个问题:在windows classic windows installer(msi)或nuget或其他软件上使用哪个软件包系统更好?

  • 我想在我的项目中使用弹性搜索,但我对使用弹性搜索有点困惑。 我应该使用spring数据弹性搜索还是弹性搜索 如果我使用的是spring data-elasticsearch,那么是否需要在local上安装elastic search 我已经构建了一个演示spring启动项目,但每当我想运行时,它都会给我一个错误,即elasticSearch模板不可用 附言:我在寻求指导的答案。谢谢

  • 问题内容: 有一个使用一个py文件(模块)构建可执行文件的示例,如下所示,我大约有4个py文件(模块),我想构建应包含所有py文件的可执行文件。 当我们有一个以上的python模块时,如何构建python可执行文件? 这里的例子 如果我有两个文件hello1.py和hello2.py,则此文件具有hello.py? 谢谢 问题答案: 如果您的文件导入了这些文件-和,则此行: 够了。 但是,如果这些

  • 问题内容: 当我使用猫鼬时,我发现了两种在nodejs中创建新文档的方法。 首先 : 第二 有什么区别吗? 问题答案: 是的,主要区别在于您可以在保存之前进行计算,也可以对构建新模型时出现的信息做出反应。最常见的示例是在尝试保存模型之前确保模型有效。其他一些示例可能是在保存之前创建任何缺失的关系,需要基于其他属性即时计算的值以及需要存在但可能永远不会保存到数据库(异常交易)的模型。 因此,作为您可

  • 问题内容: 在hibernate状态下,EJB3和Spring 3有很多共同点。我需要找出在哪里可以将Spring框架与hibernate一起使用,而不是EJB3,反之亦然。 问题答案: 您可以互换使用它们。 如果使用EJB3,则必须拥有完整的Java EE,EJB3应用服务器。有些是免费的,有些不是。 如果使用Spring 3,则需要在CLASSPATH中包含Spring JAR,但是不需要完整