当你第二次使用open时,文件锁是否会停留?

时间:2015-03-27 19:28:32

标签: perl file file-io

假设:

my $fh;
open $fh, ">>", "file.txt";
flock($fh, LOCK_EX);
open $fh, "+<", "file.txt";
close $fh;

文件锁定会保留还是会被释放?如果它会被释放有没有办法让它留下来? 我没有找到相关信息。

3 个答案:

答案 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可以让您的生活更轻松。