免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2122 | 回复: 2
打印 上一主题 下一主题

文件锁应用-请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-16 18:31 |只看该作者 |倒序浏览
配置文件r_config,里面写的内容比如为数字100
#cat r_config
100
然后,读取此文件内容,减一后,并写回去。此过程需要用锁机制。
自己写了代码如下:


#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw(:flock);
#use Fcntl ':flock';
use Fcntl qw(SEEK_END);

sub lock{
        my ($fh) = @_;
        flock($fh,LOCK_EX) or die $!;
        seek($fh,0,SEEK_END)or die $!;
}
sub unlock{
        my ($fh) = @_;
        flock($fh,LOCK_UN)or die $!;
}
my $conf = "r_config";
my $fp;
my @lines;
open($fp,"<",$conf) or die $!;
lock($fp);
@lines = <$fp>;
foreach(@lines)
{
        chomp;
        print "$_\n";
        $_--;
}
unlock($fp);
close $fp;

open ($fp,'>',$conf) or die $!;
lock($fp);
print $fp @lines;
unlock($fp);
close $fp;


如果把lock($fp),unlock($fp)都去掉,不应用锁,减一后可以写回去,加了锁,导致配置文件为空。。
请高手帮看看问题所在。。
谢谢


#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw(:flock);
#use Fcntl ':flock';
use Fcntl qw(SEEK_END);

sub lock{
        my ($fh) = @_;
        flock($fh,LOCK_EX) or die $!;
        seek($fh,0,SEEK_END)or die $!;
}
sub unlock{
        my ($fh) = @_;
        flock($fh,LOCK_UN)or die $!;
}

my $r_conf = "r_config";
my $w_conf = "w_config";

open(R_FH,"<",$r_conf) or die $!;
lock(\*R_FH);
open(W_FH,">",$w_conf) or die $!;
lock(\*W_FH);
while(<R_FH>)
{
        chomp;
        next if(/^\s+$/);
        #print "$_\n";
        $_--;
        print W_FH $_;
}
unlock(\*W_FH);
unlock(\*R_FH);
close W_FH;
close R_FH;
`mv $w_conf $r_conf -f`;

此方法是用了一个临时文件,减一后先写入临时文件,然后临时文件再重命名。。第一种方法是先打开原文件,然后读,读完保存到数组里,然后再打开原文件写,没有利用临时文件交换。。
请问哪个方法好,有更好的方法,也请高手指点。。



谢谢。。

论坛徽章:
0
2 [报告]
发表于 2010-12-17 12:13 |只看该作者
回复 1# peking_A_Liang


加一个锁文件

  1. #!/usr/bin/perl -wT

  2. use Fcntl qw(:flock);

  3. my $file = 'r_conf';
  4. my $lock = "$file.lck";

  5. open (L, ">$lock) or dir $!;
  6. flock(S, LOCK_EX);

  7. #process your file

  8. close(L);

复制代码

论坛徽章:
0
3 [报告]
发表于 2010-12-19 11:19 |只看该作者
学习了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP