打开文件说明锁定混淆(编辑)

时间:2017-08-28 23:22:22

标签: linux-kernel glibc locking multithreading flock

GNU C Library documentation中一样 fcntl(F_OFD_SETLK)锁定打开的文件表条目(通常由open()获得)。易于理解。

但在同一文档中的next example

在示例过程中,每个线程调用open(),因此每个文件描述符应指向不同的打开文件表条目。

如果从每个线程中的fcntl(fd,F_OFD_SETLKW,& lck)获取的锁与新的打开文件表条目相关联,则每个线程都会对open()返回的这个新的打开文件表条目进行锁定在每个帖子中。

那么不同文件表条目上的锁如何提供独占写访问权?

我错过了什么?

1 个答案:

答案 0 :(得分:1)

原始POSIX文件锁定每进程锁定的位置。因此,如果两个线程打开同一个文件,导致不同的文件描述符,它们都可以同时获得的独占锁(因为该进程被认为是锁所有者)。这些语义(与close行为相结合)相当无用,但由于向后兼容性原因无法更改。

因此需要单独的OFD锁fcntl操作,其行为就像使用传统POSIX锁在单独的进程中打开文件一样。在这两种情况下,内核都必须确定底层文件对象/ inode并锁定它;锁定文件描述符或文件描述是不够的。或者换句话说,POSIX和OFD锁之间的区别在于POSIX锁可以捎带已经被进程获取的锁(有点类似于递归互斥,但不完全),而对于OFD锁,调用线程是锁主人。但实际锁定总是在文件上执行。