【问题标题】:In Perl script, I can open / write to/ and close a file, but I get "bad file descriptor" when I try to flock it在 Perl 脚本中,我可以打开/写入/关闭一个文件,但是当我尝试对其进行集群时,我得到“错误的文件描述符”
【发布时间】:2019-07-30 23:57:55
【问题描述】:

我可以使用文件句柄打开文件,但是当我尝试使用相同的文件句柄进行 FLOCK 时,我得到“错误的文件描述符”。

my $file='/Library/WebServer/Documents/myFile.txt';
open(my $fh, '>', $file) or die "Could not open '$file' - $!";
    # I DO NOT GET AN ERROR FROM OPENING THE FILE

flock($fh, LOCK_EX) or die "Could not lock '$file' - $!";
    # HERE IS WHERE I GET THE "BAD FILE DESCRIPTOR" ERROR
    # IF I COMMENT THIS LINE OUT, THE PRINT AND CLOSE COMMANDS BELOW EXECUTE NORMALLY

print $fh "hello world";
close($fh) or die "Could not write '$file' - $!";

这是同一个文件句柄,为什么 OPEN 和 PRINT 有效,而 FLOCK 无效?我尝试将文件的权限设置为 646、666 和 777,但我总是得到相同的结果。

谢谢!

【问题讨论】:

  • use strict; use warnings;
  • 总是使用use strict; use warnings;。它会发现你的问题。
  • 你应该得到Invalid argument而不是Bad file descriptor
  • 为什么要锁定一个新文件?如果该文件已经存在,那么您在获得锁之前正在破坏它,这意味着即使另一个进程已锁定它,您也在破坏它。所以要么你在做一些奇怪的事情,要么是做错了什么。很可能是后者。

标签: perl descriptor flock


【解决方案1】:

您是否按照flock 文档导入了常量LOCK_EX

use Fcntl ':flock';

如果不是,LOCK_EX 没有任何意义,flock 调用将失败。使用strict 和/或warnings 会发现此系统调用存在问题。

【讨论】:

  • 感谢您的回复!我不得不将其更改为“使用 Fcntl qw(:flock);”让它在我的机器上工作,但它成功了。
猜你喜欢
  • 1970-01-01
  • 2016-05-20
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
相关资源
最近更新 更多