- 论坛徽章:
- 1
|
请教:PERL来生成文本数据最安全的方法??
- # Lock相關設定值
- $RetryNum = 100; # 重試回數
- $Interval = 0.1; # 重試的間隔時間
- $EX_LOCK = 2; # 排他鎖定
- $UN_LOCK = 8; # 解除鎖定
- $LOCKTYPE = $EX_LOCK; # 鎖定格式為排他鎖定
- $useflock = 0; # 使用flock()時設定值為1
- $Lprefix = 'L-'; # 鎖定檔案的字首
- #
- # lock(lfh,lockfile);
- # <IN>; lfh: 鎖定檔案的指標(相當於openLock指定的檔案名稱)
- # lockfile :鎖定的檔案名稱
- # <OUT>; true:成功 false:失敗
- sub lock($$)
- {
- my($lfh,$lockfile) = @_;
- if($useflock){
- flock($lfh,$LOCKTYPE);
- return 1;
- }
- else{
- my ($retry) = $RetryNum;
- while(-f $lockfile) {
- select(undef,undef,undef,$Interval);
- return undef if(--$retry <=0);
- }
- return open($lfh, ">;$lockfile");
- }
- }
- #
- # unlock(lfh,lockfile)
- # <IN>; lfh :鎖定檔案的指標(相當於以openLock指定的檔案名稱)
- # lockfile:鎖定檔案名稱
- # <OUT>; 無
- sub unlock($$)
- {
- my($lfh,$lockfile) =@_;
- if($useflock){
- flock($lfh,$UN_LOCK);
- }
- else{
- close($lfh);
- unlink($lockfile);
- }
- }
- #
- # openLock(fh,modefile)
- # <IN>; fh :指標
- # modefile: 包含模式的檔案名稱
- #<OUT>; true of false
- sub openLock(*$)
- {
- my($fh,$modefile) = @_;
- my($lockf);
- ($mode,$file) = ($modefile=~/^(\+?(?:<|>;>;?)\s*?)(.+)$/);
- if($file =~/(\/|\\)/){
- ($path,$filename) = ($file=~/^(.*[\/|\\])(.+)$/);
- }
- else{
- $path = "";
- $filename =$file;
- }
- return undef unless $filename;
- $lockf = $path.$LPrefix.$filename;
- lock($filename,$lockf) or return undef;
- open($fh,$modefile)
- or unlock($filename,$lockf), return undef;
- return 1;
- }
- #
- # closeUnlock
- # <IN>; fh:指標
- # modefile:包含模式的檔案名稱
- # <OUT>; 無
- sub closeUnlock(*$)
- {
- my($fh,$file) = @_;
- if($file =~/(\/|\\)/) {
- ($path,$filename) = ($file=~/^(.*[\/|\\])(.+)$/);
- }
- else{
- $path ='';
- $filename = $file;
- }
- my($lockfile) = $path.'L-'."$filename";
- unlock($filename,$lockfile);
- close($fh);
- }
复制代码
某本書上看到的..他用了兩種方法...做lock
一種是多建立一個lock file
一種是用flock
有興趣的自行研究..可能有bug..因為我照書上抄的
而書的例子常常會出問題...:) |
|