Perl中的flock:错误的文件描述符

Perl中的flock:错误的文件描述符,perl,locking,flock,Perl,Locking,Flock,我使用Perl v5.10.1,下面是代码的下一部分: #!/usr/bin/perl use Fcntl qw(LOCK_EX LOCK_NB); my ( $fh, $path ); $path = q{/var/run/}. time() .q{.pid}; sysopen $fh, $path, O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n}; flock ( $fh, LOCK_EX | LOCK_NB) || die qq{pi

我使用Perl v5.10.1,下面是代码的下一部分:

#!/usr/bin/perl
use Fcntl qw(LOCK_EX LOCK_NB);
my ( $fh, $path );
$path = q{/var/run/}. time() .q{.pid};
sysopen $fh, $path, O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n};
flock ( $fh, LOCK_EX | LOCK_NB) || die qq{pid "$path" already locked: $!\n};
当我尝试运行它时:

pid“/var/run/1392394505.pid”已锁定:错误的文件描述符

怎么了?有什么想法吗?

解决了

没有向该用户写入/var/run的权限。。 sudo%scriptname%工作正常

已解决

没有向该用户写入/var/run的权限。。
sudo%scriptname%工作正常

这意味着
$fh
不包含文件句柄。这是因为您错误地检查了
sysopen
是否成功。具体来说,您正遭受优先权问题的困扰

sysopen $fh, $path, O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n};
意味着

也就是说

sysopen $fh, $path, O_RDWR|O_CREAT;
使用
代替
|
。你也可以用帕伦斯。或者两者兼而有之。固定的:

sysopen(my $fh, $path, O_RDWR|O_CREAT)
   or die qq{Can't open "$path": $!\n};
另外两个错误:1)您从未导入
O_RDWR
O_create
,因此您实际上是在为
sysopen
的第三个参数传递垃圾字符串。(始终使用
使用严格;使用警告;
!)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};
}

这意味着
$fh
不包含文件句柄。这是因为您错误地检查了
sysopen
是否成功。具体来说,您正遭受优先权问题的困扰

sysopen $fh, $path, O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n};
意味着

也就是说

sysopen $fh, $path, O_RDWR|O_CREAT;
使用
代替
|
。你也可以用帕伦斯。或者两者兼而有之。固定的:

sysopen(my $fh, $path, O_RDWR|O_CREAT)
   or die qq{Can't open "$path": $!\n};
另外两个错误:1)您从未导入
O_RDWR
O_create
,因此您实际上是在为
sysopen
的第三个参数传递垃圾字符串。(始终使用
使用严格;使用警告;
!)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};
}

我不确定我是否理解变量锁文件名背后的原因。@ikegami是否有一些关于位标志和
open
?@mpapec,
man 2 open
(上面引用过),或者相同或者
perldoc-f open
,这取决于您是指系统调用还是Perl函数。我不确定我是否理解变量锁文件名背后的原因。@ikegami是否有一些关于位标志和
open
?@mpapec,
man 2 open
(上面引用过),相同或
perldoc-f open
取决于您指的是系统调用还是Perl函数。您始终需要导入它们。修复。您还可以编写
使用Fcntl qw(:flock)
要导入锁,您始终需要导入它们。修复。您还可以编写
使用Fcntl qw(:flock)导入锁_XXX常量