2017-08-28 106 views
0

GNU C Library documentation fcntl(F_OFD_SETLK)锁定打开文件表项(通常由open()获取)。容易明白。打开文件说明Locks confusion(编辑)

但在同一文档中的next example

在示例过程中,每个线程调用open(),所以每个文件描述符应指向一个不同的打开文件表项。

如果从每个线程中的fcntl(fd,F_OFD_SETLKW,& lck)获取的锁与新的打开文件表项关联,则每个线程都会获得由open()返回的新的打开文件表项的锁定。在每个线程中。

话,怎么可能在不同的文件表项的锁提供独占写访问?

我缺少什么?

+0

我不明白这个问题。为什么你认为''只是锁定不同的开放文件表条目......意味着这个锁定是完全错误的''? – Scott

+1

该示例显示了每个线程如何锁定文件以获得独占写入访问权限,导致其他线程停止运行,直到锁定释放。现在你的问题是什么? – Philippos

+0

如果每个线程使用fcntl(fd,F_OFD_SETLKW,和LCK)获取的锁与一个新打开的文件表项相关联,则每个线程获得这个新的文件打开表通过开放()返回在每个线程进入一个锁。那么如何才能锁定不同的文件表条目提供独占写访问? –

回答

0

原始POSIX文件锁在那里每个进程的锁。其结果是,如果两个线程打开同一个文件,从而导致不同文件描述符,他们都可以在同一时间获得独占锁(因为这个过程被认为是锁的所有者)。这些语义(结合close行为)相当无用,但出于向后兼容性的原因无法更改。

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