1

我使用 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" 已经锁定:错误的文件描述符

它出什么问题了?有任何想法吗?

4

2 回答 2

6

这意味着$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_RDWRand 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};
}
于 2014-02-14T17:40:21.413 回答
0

解决了

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

于 2014-02-14T16:36:29.860 回答