【问题标题】:What is the difference between locking with `fcntl` and `flock`?使用`fcntl`和`flock`锁定有什么区别?
【发布时间】:2015-04-13 17:25:42
【问题描述】:

我读了几个小时,但不明白这两个锁之间的区别是什么。我唯一了解的是fcntl() lock 提供了一种粒度锁,可以锁定特定字节,并且只有fcntl() 支持 NFS 锁定。

据说区别在于它们的语义,当被dup()fork()复制时它们的行为如何,但我不明白在实践中有什么区别。

我的情况是,我正在写入基于fork() 的服务器中的日志文件,当某事 发生时,每个分叉的进程都在写入同一个文件。为什么要使用flock() 以及为什么要使用fcntl() 锁?

【问题讨论】:

  • 为 Linux 找到的上一个问题。有趣的答案也提到了 Posix。 stackoverflow.com/questions/22409780/flock-vs-lockf-on-linux
  • flock()lockf() 是两个不同的东西,lockf() 通常包装 fcntl(),我在问语义到底是什么(关于关闭和传递的行为)。跨度>
  • 我链接的答案开始 “flock() 和 lockf() 之间的实际区别在于语义(关于关闭和传递的行为)” 和 @987654333 @ 可以包装 fcntl() 也许这个答案是相关的。
  • 天气,我从您发布的答案中复制了我上一条评论的结尾。对不起,如果我没有很好地解释自己(英语不是我的母语),我想知道关闭和通过时的行为有什么区别。

标签: c locking posix


【解决方案1】:

我试图根据可用的文档找出差异并得出以下结论(如果我错了,请纠正我):

使用 fcntl() (POSIX):

  • 您在文件系统级别创建了一个锁定记录,包括进程 ID。

  • 如果进程终止或关闭此文件的任何文件描述符,系统会删除锁定记录。

  • 如果文件描述符未以写访问权限打开,则对独占锁的请求将失败。

  • 简单地说:fnctl 锁作为进程文件关系工作,忽略文件描述符

flock() (BSD) 是不同的(Linux:从内核 2.0 开始,flock() 本身作为系统调用实现,而不是在 GNU C 库中模拟为对 fcntl 的调用):

  • flock() 在系统的“打开文件描述”上创建锁。 “打开文件描述”由 open() 调用生成。

  • 文件描述符 (FD) 是对“打开文件描述”的引用。 dup()fork() 生成的 FD 引用相同的“打开文件描述”。

  • 一个进程可以通过多次打开()文件为一个文件生成多个“打开文件描述”

  • flock() 通过 FD 将其锁定放置在“打开文件描述”上

  • 因此,flock() 可用于同步进程之间以及线程(在一个或多个进程中)之间的文件访问。

  • 有关“打开文件描述”的详细信息,请参阅 flock(2) 尤其是 open(2) 手册页。

在您的场景中,您可能希望使用基于 fcntl() 的锁,因为您的分叉进程将自行 open() 日志文件,并且不希望继承带有可能放置的锁的文件描述符。

如果您需要在多个线程之间进行同步,可能在多个进程中,您应该使用基于flock() 的锁,如果您的系统支持它们而不通过fcntl() 进行模拟。然后每个线程都需要 open() 文件,而不是使用 dup()ed 或 fork()ed 句柄。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 2011-04-13
    • 1970-01-01
    • 2012-08-03
    • 2018-04-19
    • 1970-01-01
    • 2010-10-22
    • 2010-12-09
    相关资源
    最近更新 更多