2015-09-04 79 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