【问题标题】:flock in Perl: Bad file descriptorPerl中的flock:错误的文件描述符
【发布时间】:2014-03-14 02:39:36
【问题描述】:

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

它有什么问题?有什么想法吗?

【问题讨论】:

  • 我不确定我是否理解变量锁定文件名背后的原因。
  • @ikegami 是否有按位标志和open 的参考?

标签: perl locking flock


【解决方案1】:

这意味着$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_RDWRO_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};
}

【讨论】:

  • 总是需要导入它们。固定。
  • 你也可以写use Fcntl qw(:flock);来导入LOCK_XXX常量
【解决方案2】:

解决了

没有权限写入 /var/run 给这个用户.. sudo %scriptname% 工作正常

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2011-09-08
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多