2012-11-04 26 views
4

我通过fcntl使用POSIX 强制性 文件锁定。我想知道这些锁是否是可重入的,即。一个进程能获得它已经拥有的锁吗?POSIX文件锁是否可重入?

+0

您确定自己的意思是*必填*文件锁吗?上次我看,POSIX不支持强制锁定。 – cdarke

+0

@cdarke Oups!我的意思是咨询......感谢您的报告。 – paradigmatic

+0

没有'fcntl'锁不可重入。您必须使用有效检查手动包装锁定和解锁代码。而'fcntl'行为可能会因您的实施系统而异。 – askmish

回答

3

通过fcntl的咨询锁定位于每个进程基础上,并且仅为给定进程累积文件上的锁定间隔。也就是说,应用程序需要跟踪时间间隔,并且任何时间间隔的解锁呼叫都会将其解锁,而不管该时间间隔内有多少次锁定呼叫。

更糟的是,对于该文件的任何文件描述符的收盘取消对文件中的所有锁:

除了通过明确的F_UNLCK被删除,进程终止时记录锁 自动释放或如果它关闭任何参考持有锁的文件的 文件描述符。这很糟糕:这意味着某个进程可能会丢失 文件(如 /etc/passwd或/ etc/mtab)上的锁,因为某些原因库函数决定打开,读取并关闭它。

+0

您不必自己追踪所有权。由于'fcntl'锁定了记录所有者,并且有一个API来读取当前所有者,所以您可以在锁定之前简单地查看您是否是所有者,如果是,则跳过锁定/解锁步骤。 –

+0

@R ..你的意思是结构的'l_pid'字段?这不适用于通过同一个进程跟踪多个锁,它只会告诉您(其中一个)会阻止您的进程,而不是如果您已经拥有同一进程的范围(部分)。 –

+0

如果你正在复杂地使用重叠范围,那么是的,我同意。我假设整个文件锁或非重叠范围的锁,你可以假设,如果范围内的任何内容被锁定,整个范围被一个进程锁定。 –