这意味着$fh
不包含文件句柄。那是因为您错误地检查了是否sysopen
成功。具体来说,您遇到了优先级问题。
sysopen $fh, $path, O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n};
方法
sysopen $fh, $path, ( O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n} );
意思是
sysopen $fh, $path, O_RDWR|O_CREAT;
使用or
而不是||
. 你也可以使用括号。或两者。固定的:
sysopen(my $fh, $path, O_RDWR|O_CREAT)
or die qq{Can't open "$path": $!\n};
另外两个错误:1)您从不导入O_RDWR
and O_CREAT
,因此您实际上为sysopen
的第三个参数传递了一个垃圾字符串。(始终使用use strict; use warnings;
!) 2)您的错误信息不正确。你说它已经被锁定了,即使它不是。固定的:
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw( LOCK_EX LOCK_NB O_RDWR O_CREAT );
my $path = q{/var/run/}. time() .q{.pid};
sysopen(my $fh, $path, O_RDWR|O_CREAT)
or die qq{Cannot open "$path": $!\n};
if (!flock($fh, LOCK_EX | LOCK_NB)) {
die qq{Can't lock "$path": $!\n} if !$!{EWOULDBLOCK};
die qq{pid already locked\n};
}