我怎么知道一个文件是否在C上的其他地方打开?

如何判断一个文件是否在C中打开? 我认为更多的技术问题是如何检索现有文件的引用数量,并确定该信息是否可以安全地打开。

我正在实现的想法是一个文件队列。 你转储一些文件,我的代码处理文件。 我不想开始处理,直到生产者closures文件描述符。

一切都在linux中完成。

谢谢,Chenz

挖出信息是很多工作(你必须搜索thorugh / proc / * / fd你会更好的与任何:

  • 保存到临时然后重命名。 将文件写入临时文件名或目录,当您完成写入时,将其重命名为您的应用程序读取它们的目录。 重命名是原子的,所以当文件存在时,你知道它是安全的阅读。
  • 也许是上面的一个变种,当你写完文件foo的时候,你创建一个名为foo.finished的空文件。 处理文件时,请查找* .finished的存在。
  • 在写入的同时锁定文件,读取文件的方式将被阻止,直到作者解锁。 看到flock / lockf函数,它们是咨询锁,尽管读者和写作者都必须锁定和兑现锁。

我不认为有什么办法可以在纯C中做到这一点(它不会跨平台)。

如果您知道提前使用的文件,则可以使用inotify在打开时通知他们。

C有处理文件的功能,但没有太多的信息。 在可移植的C中,你可以做的唯一的事情就是试图以所需的方式打开文件,看看它是否工作。

一般你不能这样做 variuos的原因(例如,你不能说,如果该文件是与另一个用户打开)。

如果你可以控制打开文件的进程,并试图通过锁定文件来避免冲突(为了做到这一点,Linux上有很多库)

使用lsof命令。 (列出打开的文件)。

如果你控制生产者和消费者,你可以使用flock()的lockf()来锁定文件。

在大多数发行版都有lsof命令,它显示所有当前打开的文件,如果你的文件在同一目录中或者有一些可识别的名称模式,你可以输出它的输出。

打开一个shell并键入

man ftrylockfile 

您打开文件,然后将其传递给此函数,如果返回值不为零,则文件已被锁定,否则将锁定文件并返回0。

那么当你完成你的funclockfile()它。