【发布时间】:2017-11-15 05:44:01
【问题描述】:
如果一个进程使用 open(2) (或类似的)来获取多个 同一个文件的描述符,这些描述符被处理 由flock()独立。尝试使用以下之一锁定文件 这些文件描述符可能会被调用的锁拒绝 进程已经通过另一个描述符放置。
如果 flock() 独立处理描述符,为什么使用其中一个文件描述符锁定文件会被通过另一个描述符放置的锁定拒绝?这里独立是什么意思?
另外,如果我解锁其中一个描述符,其他描述符也会解锁吗?
【问题讨论】:
如果一个进程使用 open(2) (或类似的)来获取多个 同一个文件的描述符,这些描述符被处理 由flock()独立。尝试使用以下之一锁定文件 这些文件描述符可能会被调用的锁拒绝 进程已经通过另一个描述符放置。
如果 flock() 独立处理描述符,为什么使用其中一个文件描述符锁定文件会被通过另一个描述符放置的锁定拒绝?这里独立是什么意思?
另外,如果我解锁其中一个描述符,其他描述符也会解锁吗?
【问题讨论】:
由flock() 独立处理 意味着flock() 在尝试修改另一个描述符时不会“询问”一个描述符。然而,这并不意味着他们是真正独立的。如果flock() 尝试锁定一个,而另一个已经锁定,则此尝试可能会阻塞。
将其视为 2 级机制。 flock() 一次只查看一个描述符,但最终,在尝试锁定时,系统会尝试移动到 dipper 级别并实际锁定,然后问题就出现了。
如果我解锁其中一个描述符,其他描述符也会解锁吗?
我不确定。这句话(如下)表明,如果文件具有来自fork(2), dup(2) 的多个描述符,情况确实如此。但是,在第 2 段中没有任何内容可以处理多个 open(2),这让我相信这不是一件好事:)
来自here:
flock() 创建的锁与打开的文件描述相关联 (见打开(2))。这意味着重复的文件描述符(创建 例如,fork(2) 或 dup(2)) 指的是同一个锁,而这 可以使用这些文件描述符中的任何一个来修改或释放锁。 此外,锁由显式 LOCK_UN 释放 对这些重复文件描述符中的任何一个进行操作,或者当所有 此类文件描述符已关闭。
如果一个进程使用 open(2) (或类似的)来获取多个文件 同一个文件的描述符,这些文件描述符被处理 由flock()独立。尝试使用以下之一锁定文件 这些文件描述符可能会被调用的锁拒绝 进程已经通过另一个文件描述符放置。
【讨论】:
假设您的进程有两个文件描述符fd1 和fd2,它们对同一个文件进行操作。如果您在fd1 上锁定文件的一个段,然后在fd1 上锁定另一个重叠段,则这两个锁不会相互干扰,因为它们位于同一个文件描述符上。
但是,如果在fd2 而不是fd1 上应用第二个锁,那么这些锁将重叠,并且第二个锁将被视为首先干扰并失败,尽管事实上它是相同的进行锁定的进程。
这就是文件描述符上的锁相互独立的意义——锁定系统不检查哪个进程拥有不同文件描述符上的干扰锁;它不是当前文件描述符就足够了。
当您解锁一个描述符时,您不会更改任何其他文件描述符上的锁。
【讨论】: