【发布时间】:2013-09-06 01:05:35
【问题描述】:
我正在开发一个多线程系统,其中可以根据文件访问权限在不同线程之间共享文件。
如何检查文件是否已被另一个线程打开?
【问题讨论】:
-
你需要一个物理锁,或者跨线程定义一个信号量(驻留在共享内存中?)
-
最简单的方法是保留所有打开文件的共享列表,并使其可供所有线程使用。
-
嗯,最简单的方法就是自己跟踪它。
-
附带说明:如果您想检查文件是否已经打开(通过任何其他进程或线程),您可以尝试获取文件写入租约(@ 987654322@)。如果文件已经被其他人打开,它将失败。这仅适用于用户拥有的普通文件。如果其他人试图打开该文件,则租约所有者将收到一个信号,并且最多有
/proc/sys/fs/lease_break_time秒来操作文件并释放或降级租约,然后其他打开将继续进行(但它最终会,即使您重命名或取消链接文件)。 -
无论这要解决什么问题,它实际上并没有解决它 - 你只能找出文件是否打开/没有打开 - 并且可以随时更改(甚至 而你正在收集你的数据...)。因此,您得到的任何答案都会立即过时并且实际上毫无意义。使用此处找到的任何答案都是 TOCTOU bug 等待发生。根据该 Wiki 链接:“TOCTOU 竞争条件在 Unix 中在文件系统上的操作之间很常见。”不仅仅是 Unix - Windows 文件系统也是如此。