Perl中的Flock不起作用
我有一个Perl文件。用户打开一个文件,读取数据并在网格中显示数据。用户编辑并将其保存回文件 我试图使用flock,这样当用户读取文件时,文件就会被锁定。我尝试了下面的代码,但不起作用 参考这篇文章的公认答案Perl中的Flock不起作用,perl,file-handling,flock,Perl,File Handling,Flock,我有一个Perl文件。用户打开一个文件,读取数据并在网格中显示数据。用户编辑并将其保存回文件 我试图使用flock,这样当用户读取文件时,文件就会被锁定。我尝试了下面的代码,但不起作用 参考这篇文章的公认答案 使用Fcntl':flock'#在开头添加了这个 $filename=dsfs.com/folder1/test.txt#我的文件的位置 打开(我的$fh,有两个问题: flock将阻止,直到它可以锁定。因此,您需要flock($file,lock|EX | lock|NB)或die$!
使用Fcntl':flock'#在开头添加了这个
$filename=dsfs.com/folder1/test.txt#我的文件的位置
打开(我的$fh,有两个问题:
flock
将阻止,直到它可以锁定。因此,您需要flock($file,lock|EX | lock|NB)或die$!
flock
(在Unix上)是建议性的。它不会阻止他们访问它,除非他们也检查锁
如果您的flock
实现基于lockf(3)
或fcntl(2)
,这可能是另一个问题。也就是说,LOCK\u EX
应该与“写意图”一起使用,在为输出而打开的文件上
对于锁(3)
,表示
请注意,使用lockf(3)构建的仿真不提供共享锁,它要求FILEHANDLE以写意图方式打开
对于fcntl(2)
:
请注意,flock(3)的fcntl(2)仿真要求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;
打开我的$lock,“>>”,“$filename.lock”;
flock$lock,lock_EX;
#在我们的进程锁定之前不能到这里。。。
打开(我的$fh,,$filename;
…重写文件。。。
收盘价$fh2;
#完成此操作后,可以释放锁并让另一个
#进程访问该文件
关闭$lock;
不要使用纯字符串文件名;请将其括在引号中。请使用使用警告;
和使用严格;
这会告诉您这样做。这真的是您正在运行的代码吗?您应该会得到语法错误。@ThisSuitesBlacknot-我注释掉了使用严格。就是说,上面的代码没有给我任何错误osted.commoting outstrict
很神奇,几乎就像将错误记录到/dev/null。即使没有strict,$filename=dsfs.com/folder1/test.txt
中缺少的分号也会导致语法错误。当出现错误时,请不要注释掉使用strict;
,请只复制并粘贴您正在运行的确切代码当你问一个关于堆栈溢出的问题时,@sobrique-它还不起作用。如果我使用上面的答案,它将如何响应?它不会让用户自己打开文件,还是会在用户试图打开文件时通知用户该文件正在使用?或者它不会让用户进行更改。我尝试了,但我仍然能够进行更改并保存它。请注意:我使用的是.txt扩展名。我想应该有不同的过程来锁定.txt文件和.csv文件file@ThisSuitIsBlackNot-这正是我现在关心的问题。我的文件名中包含fqdn。tat会有所不同吗?或者在rw模式下打开+>
并进行大量搜索。
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;