【问题标题】:How can I test whether a file has been opened for writing in Perl?如何测试是否已打开文件以使用 Perl 进行写入?
【发布时间】:2009-08-13 13:39:40
【问题描述】:

在我的应用程序中,我需要检查是否已打开给定文件以写入另一个进程,即使此文件已打开,我的应用程序也只是跳过此文件,这里不会发生类似“死”的事情。


我的问题的更详细描述:

涉及两个过程。进程A是生产者进程,进程B是消费者进程w。

进程 A 会创建一些请求给 B 来处理,他创建请求的方式只是在某个目录下创建一个基于 txt 的文件。当A创建请求时,他不知道B是否还活着,他需要做的就是放弃请求,有点像给B写一封电子邮件。创建请求文件后,A再也不会访问它。

prpcess B ,有时向上有时向下。当它运行时,B 将“假脱机”A drop 请求的目录。对于每个请求文件,B 只需将其读取并删除即可。

但我认为那里存在一些竞争条件。例如,A 刚打开一个文件,正在用请求填充文件,然后 B 想读取同一个文件并手 它。

我的问题是我应该如何在 perl 中优雅地处理竞争条件?

【问题讨论】:

  • 我们需要知道您在哪个操作系统上运行
  • 您想知道它目前是打开的,还是最近被修改过的?
  • 在大多数操作系统上要解决的烦人问题。告诉我们您想要完成的工作,我们可能会想出一个更好的计划。

标签: perl file


【解决方案1】:

感谢您对问题的更新。以下是我的做法:

  • 进程 A 打开一个临时文件并写入它。您以 Process B 忽略它的方式命名文件。您可以通过将其放在临时目录中、使用 B 不处理的后缀或其他方式来做到这一点。
  • A 完成后,它会关闭文件。该文件现已完成,但具有临时名称。
  • A 将文件重命名为其最终名称,B 将其识别为需要处理的内容。
  • B 处理文件。


根据我之前的回答,现在在问题中进行了解释:

这听起来像是一个可疑的策略。例如,假设进程 A 打开文件 1 进行写入并开始使用它。进程 B 启动并考虑处理文件 1。它应该跳过它吗?如果进程 A 在进程 B 确定文件是否打开之前关闭文件怎么办?进程 B 是否应该再次处理文件 1?

听起来您有一个XY Problem,您在其中向我们提供了您认为的解决方案,但没有告诉我们问题或任务。你想要完成或避免什么?比如:

  • 同一个程序有许多实例并行处理许多文件以用于同一目的
  • 同时运行的不同程序必须为不同的目的处理相同的文件,可能是按顺序处理
  • 同一个程序可能有很多实例,但只有一个实例应该更新文件(即两个人同时尝试更新同一个文件)。
  • 其他一些情况

告诉我们您在做什么,我们或许能够解决您的问题,而不仅仅是回答您的问题。 :)

【讨论】:

  • 我的问题已经添加了更详细的描述,那么是时候写下你的智慧了。
【解决方案2】:

你没有说你在哪个操作系统上运行。如果是 Unix(或衍生产品),请查看 lsof。这将告诉您(除其他外)打开了哪些文件、由谁打开等。

手册页here。注意 -F 选项,它以适合其他程序解析的方式输出。

【讨论】:

  • 该应用程序将在 linux 上运行。我会先检查lsof。非常感谢!
【解决方案3】:

补充 Brian Agnew 的回答:如果您想使用 lsof,请查看 CPAN 上的 Unix::Lsof,它为命令提供了 perlish 接口。

【讨论】:

    【解决方案4】:

    这就是文件锁要处理的事情,但您可能甚至不需要获得那个低级别。如果链的两端都是Perl,你应该看看使用IPC::DirQueue来管理队列;它经过了很好的测试并且很灵活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2013-08-15
      • 2011-07-01
      • 2012-06-04
      相关资源
      最近更新 更多