【发布时间】:2016-02-21 10:11:58
【问题描述】:
我正在尝试测试一段代码 ($code),以确保一次只运行一个程序实例:
#!/usr/bin/perl
# test_lock
use strict;
use warnings;
( my $code = <<'CODE') =~ s/^\s+//gm;
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw(:flock);
# Make sure only one instance of the program is running at a time.
open our $Lock, '<', $0 or die "Can't lock myself $0: $!";
flock $Lock, LOCK_EX | LOCK_NB
or die "Another instance of $0 is already running. Exiting ...\n";
sleep(2);
CODE
my $progfile = '/tmp/x';
open my $fh, '>', $progfile or die $!;
print $fh $code;
close $fh;
$|++;
my $ex1 = system("perl $progfile &");
print "First system(): $ex1\n";
my $ex2 = system("perl $progfile");
print "Second system(): $ex2\n";
我预计对system() 的第二次调用将返回一个非零值($ex2),因为它无法获得锁和dies。但是我得到:
$ perl test_lock
First system(): 0
Another instance of /tmp/x is already running. Exiting ...
Second system(): 0
我的假设有什么问题? (有没有更好的方法来测试$code?)
【问题讨论】:
-
第二个系统调用(在 cygwin 上)的退出代码为 2816,但在 linux 机器上我得到 0... 奇怪。
-
我在 linux 机器上也得到了代码 2816,我无法重现退出代码 0。
-
好的,我尝试运行它几次 (
for n in 1 2 3 4 5; do echo "--> run n. $n"; perl test_lock; sleep 5; done),我得到了预期的行为 5 次中有 2 次。我运行 Linux。 -
我怀疑这与您在第一次调用时背景
&而不是第二次调用有关,但我无法确认。 -
因此,想要锁定一个文件(多次)然后什么都不做,这似乎有点奇怪......你想要的实际用例是什么?