与GNU C Library documentation中一样
fcntl(F_OFD_SETLK)
锁定打开的文件表条目(通常由open()
获得)。易于理解。
但在同一文档中的next example:
在示例过程中,每个线程调用open()
,因此每个文件描述符应指向不同的打开文件表条目。
如果从每个线程中的fcntl(fd,F_OFD_SETLKW,& lck)获取的锁与新的打开文件表条目相关联,则每个线程都会对open()返回的这个新的打开文件表条目进行锁定在每个帖子中。
那么不同文件表条目上的锁如何提供独占写访问权?
我错过了什么?
答案 0 :(得分:1)
原始POSIX文件锁定每进程锁定的位置。因此,如果两个线程打开同一个文件,导致不同的文件描述符,它们都可以同时获得的独占锁(因为该进程被认为是锁所有者)。这些语义(与close
行为相结合)相当无用,但由于向后兼容性原因无法更改。
因此需要单独的OFD锁fcntl
操作,其行为就像使用传统POSIX锁在单独的进程中打开文件一样。在这两种情况下,内核都必须确定底层文件对象/ inode并锁定它;锁定文件描述符或文件描述是不够的。或者换句话说,POSIX和OFD锁之间的区别在于POSIX锁可以捎带已经被进程获取的锁(有点类似于递归互斥,但不完全),而对于OFD锁,调用线程是锁主人。但实际锁定总是在文件上执行。