第二次使用 open 时文件锁会保留吗?

Do file locks stay when you use open for a second time?

假设:

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

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

在已分配给打开的文件描述符的文件句柄上调用 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

不,您将失去锁定,因为对同一文件句柄的第二次 open 调用会先隐式关闭原始文件。

你想做什么?看起来您想将文件完全保留给自己,在这种情况下,我建议使用 File::Temp 创建一个临时文件并将其锁定为标志。然后其他进程将在同一临时文件上请求他们想要的锁,然后可以在获得锁后继续处理 file.txt

你知道 flock 合作的吗,所以它不会阻止另一个进程对文件做它想做的事,除非它也在使用 flock 并等待访问被授予?

无论您观察到什么行为,我都不会依赖它。


我认为您正在尝试打开一个文件句柄进行读写,必要时创建它,但不会破坏任何现有内容,并且您发现 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 可以让您的生活更轻松。