2015-09-04 70 views
0

我有一个Perl文件。用户打开文件,读取数据并在网格中显示数据。用户编辑它并将其保存回文件。在Perl中羊群不工作

我想使用flock,以便当用户读取文件时,文件被锁定。我尝试了下面的代码,但它没有奏效。

参考此帖子的接受答案。 How do I lock a file in Perl?

use Fcntl ':flock';       #added this at the start 
$filename= dsfs.com/folder1/test.txt;  #location of my file 

open(my $fh, '<', $filename) or die $!;  #file open 
flock($fh, LOCK_EX) or die "Could not lock '$file' - $!"; #inserted flock before reading starts so that no other user can use this file 
#reading of file starts here 
#once read, user saves file. 

close($fh) or die "Could not write '$file' - $!"; #release lock after user writes. 

我想这是周围没有任何条件,比赛正常操作,但对于我,我这个多年平均值的工作我不知道,如果perl脚本能够检测羊群与否。

出于测试目的,我尝试在我的写入和保存功能完成之前打开文件。当我尝试在保存完成之前打开相同的文件时,这意味着该锁尚未释放。在这种情况下,如果我在后端打开文件并编辑文件,我仍然可以保存更改。在实际情况下,一旦文件被锁定,它不应该编辑任何东西。

任何人都可以请建议我任何故障排除这或我的程序使用羊群不正确?

+4

不要使用裸字符串的文件名;用引号括起来。不要使用'使用警告';'严格使用';'这会告诉你这样做。 –

+0

这真的是你正在运行的代码吗?你应该会得到一个语法错误。 – ThisSuitIsBlackNot

+0

@ ThisSuitIsBlackNot-我注释了使用严格。多数民众赞成它没有给我任何错误的上述代码我张贴。 – Ayesha

回答

4

还有,如果你的flock实现基于lockf(3)fcntl(2),它有可能是另一个问题。即,LOCK_EX应与打开输出文件的“写入意图”一起使用。

对于lockf(3)perldoc -f flock

注意,与提供lockf(3)不提供共享锁,它要求FILEHANDLE与写意图开建的仿真。

fcntl(2)

注意,的fcntl(2)群的仿真(3)要求FILEHANDLE与读意图打开使用LOCK_SH并要求它与写意图,以开放使用LOCK_EX。

输入文件或更复杂的同步操作的解决方法是对所有过程,在一个简单的锁定文件同步,例如:

open my $lock, '>>', "$filename.lock"; 
flock $lock, LOCK_EX; 

# can't get here until our process has the lock ... 
open(my $fh, '<', $filename) or die $!;  #file open 
... read file, manipulate ... 
close $fh; 
open my $fh2, '>', $filename; 
... rewrite file ... 
close $fh2; 

# done with this operation, can release the lock and let another 
# process access the file 
close $lock; 
+1

或者在rw模式下打开'+ >>'并且寻找很多。 –

3

有两个问题:

  • flock将阻塞,直到可以锁定。因此您需要flock ($file, LOCK_EX | LOCK_NB) or die $!;
  • flock(在Unix上)是咨询。它不会阻止他们访问它,除非他们也检查锁。
+0

@sobrique - 它没有工作,如果我使用上述答案,它是如何响应的?它不会让用户打开文件本身,或者当它试图打开文件时是否会通知用户该文件正在使用中?或者它不会让用户进行更改。请注意:我使用.txt扩展名,我想应该有一个不同的过程来锁定一个.txt文件和一个.csv文件 – Ayesha

+0

@ ThisSuitIsBlackNot-现在完全是我的顾虑了。文件名包含fqdn,将达到什么样的效果? – Ayesha