如何测试文件是否已在Perl中打开以进行写入?

时间:2009-08-11 09:13:24

标签: perl file

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

<小时/> 我的问题的更详细的描述:

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

进程A将创建一些B处理请求,并且他创建请求的方式只是在某个目录下创建一个基于txt的文件。当A创建请求时,他不知道B是否存在,他需要做的只是删除请求,有点像写一封电子邮件给B.创建请求文件后,A再也不会访问它了。

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

但我认为那里有一些竞争条件。例如,A只是打开一个文件,正在填写请求的文件,然后B想要读取相同的文件和手 它。

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

4 个答案:

答案 0 :(得分:4)

感谢您对问题的更新。我就是这样做的:

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

<小时/> 从我之前的回答,现在在问题中解释:

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

听起来你有一个XY Problem,你在那里向我们提供你认为解决方案的内容,但却没有告诉我们这个问题或任务。你想要完成或避免什么?类似的东西:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

补充Brian Agnew的答案:如果你想使用lsof检查CPAN上的Unix :: Lsof,它为命令提供了一个perlish接口。

答案 3 :(得分:0)

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