在我的应用程序中,我需要检查一个给定的文件是否已经打开以便为另一个进程写入,即使这个文件已经打开,我的应用程序也只是跳过这个文件,并且这里不会发生类似“死亡”的事情。 / p>
<小时/> 我的问题的更详细的描述:
涉及两个过程。进程A,它是生产者进程,进程B是消费者进程。
进程A将创建一些B处理请求,并且他创建请求的方式只是在某个目录下创建一个基于txt的文件。当A创建请求时,他不知道B是否存在,他需要做的只是删除请求,有点像写一封电子邮件给B.创建请求文件后,A再也不会访问它了。
prpcess B,有时会上升,有时会下降。当它运行时,B将“假脱机”A drop需要的目录。对于每个请求文件,B只需将其读取并将其删除即可。
但我认为那里有一些竞争条件。例如,A只是打开一个文件,正在填写请求的文件,然后B想要读取相同的文件和手 它。
我的问题是我应该如何在perl中优雅地处理竞争条件?
答案 0 :(得分:4)
感谢您对问题的更新。我就是这样做的:
<小时/> 从我之前的回答,现在在问题中解释:
这听起来像是一个可疑的策略。例如,假设进程A打开文件1进行写入并开始使用它。进程B启动并考虑处理文件1。它应该跳过吗?如果进程A在进程B确定它是否已打开之前关闭文件,该怎么办?进程B应该再次处理文件1吗?
听起来你有一个XY Problem,你在那里向我们提供你认为解决方案的内容,但却没有告诉我们这个问题或任务。你想要完成或避免什么?类似的东西:
告诉我们您在做什么,我们可以解决您的问题,而不仅仅是回答您的问题。 :)
答案 1 :(得分:1)
答案 2 :(得分:1)
补充Brian Agnew的答案:如果你想使用lsof检查CPAN上的Unix :: Lsof,它为命令提供了一个perlish接口。
答案 3 :(得分:0)
这是文件锁要处理的东西,但你可能甚至不需要得到那个低级别。如果链的两端都是Perl,那么您应该使用IPC::DirQueue
来管理队列;它经过了很好的测试和灵活。