- 论坛徽章:
- 0
|
配置文件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`;
此方法是用了一个临时文件,减一后先写入临时文件,然后临时文件再重命名。。第一种方法是先打开原文件,然后读,读完保存到数组里,然后再打开原文件写,没有利用临时文件交换。。
请问哪个方法好,有更好的方法,也请高手指点。。
谢谢。。 |
|