假设:
my $fh;
open $fh, ">>", "file.txt";
flock($fh, LOCK_EX);
open $fh, "+<", "file.txt";
close $fh;
文件锁定会保留还是会被释放?如果它会被释放有没有办法让它留下来? 我没有找到相关信息。
答案 0 :(得分:3)
在已分配给打开文件描述符的文件句柄上调用open
会对文件句柄执行隐式关闭。关闭一个锁定的文件句柄会释放锁定。
通过在两种不同的模式下使用相同的文件句柄打开相同的文件,我不清楚你要做什么。如果你使用了第二个文件句柄怎么办?
open my $fh, ">>", "file.txt";
flock($fh, LOCK_EX);
open my $fh2, "+<", "file.txt";
... rewrite 'file.txt' with $fh2 ...
close $fh2; # done with rewrite
close $fh; # done with lock
对于flock
模式的文件,看起来+<
受到尊重(在Linux中运行,这可能不是可移植的),所以使用它和一些seek
语句,你只需要单个文件句柄。
# make sure file exists before you use '+<' mode
{ open my $touch,'>>','file.txt'; }
open my $fh, '+<', 'file.txt';
flock $fh, LOCK_EX;
seek $fh, 0, 2;
print $fh 'stuff for the end of the file';
seek $fh, 0, 0;
print $fh 'something for the start of the file';
close $fh; # releases lock
答案 1 :(得分:3)
不会,您将失去锁定,因为对同一文件句柄的第二次open
调用会先隐式关闭原始锁定。
你想做什么?看起来您希望将文件完全保留给自己,在这种情况下,我建议使用File::Temp
创建一个临时文件并将其锁定为标志。然后,其他进程将在同一个临时文件上请求他们想要的锁,然后可以在file.txt
获得它时继续工作。
您是否意识到flock
是合作,因此它不会阻止其他进程使用该文件执行其喜欢的操作,除非它还使用flock
并等待获得授权?
答案 2 :(得分:1)
我不会依赖于你观察到的任何行为。
我认为您正在尝试打开文件句柄进行读写,必要时创建它,但不会破坏任何现有内容,并且您发现open
无法完成所有这三项操作。
使用以下内容代替open
的两种用法:
use Fcntl qw( O_RDWR O_CREAT LOCK_EX );
sysopen(my $fh, "file.txt", O_RDWR | O_CREAT, 0666)
or die($!);
flock($fh, LOCK_EX)
or die($!);
使用File::Temp可以让您的生活更轻松。