你好 Stackoverflowers,
我是 Perl 的 autodie 的作者pragma,它改变了 Perl 的内置函数以在失败时抛出异常。它类似于 Fatal ,但具有词法作用域、可扩展的异常模型、更智能的返回检查以及更好的错误消息。它将在 Perl 的 future 版本(暂时为 5.10.1+)中取代 Fatal
模块,但目前可以从 Perl 5.8.0 及更高版本的 CPAN 下载。
下一个版本的 autodie
将使用 LOCK_NB
(非阻塞)选项添加对 flock
调用的特殊处理。虽然失败的 flock
调用通常会导致 autodie
下的异常,但使用 LOCK_NB
调用失败的 flock
将如果返回的错误号 ($!
) 是 EWOULDBLOCK
,则仅返回 false。
这样做的原因是人们可以继续编写如下代码:
use Fcntl qw(:flock);
use autodie; # All perl built-ins now succeed or die.
open(my $fh, '<', 'some_file.txt');
my $lock = flock($fh, LOCK_EX | LOCK_NB); # Lock the file if we can.
if ($lock) {
# Opportuntistically do something with the locked file.
}
在上面的代码中,由于其他人已经锁定文件 (EWOULDBLOCK
) 而导致的锁定失败不被视为硬错误,因此自动执行 flock
只是返回一个假值。在我们使用不支持文件锁的文件系统或网络文件系统并且网络刚刚死机的情况下,当它看到我们的 errno 时,autodying flock
会生成一个适当的异常不是 EWOULDBLOCK
。
这在我的 Unix 风格系统上的开发版本中工作得很好,但在 Windows 下却非常失败。看起来虽然 Windows 下的 Perl 支持 LOCK_NB
选项,但它没有定义 EWOULDBLOCK
。相反,当发生阻塞时返回的 errno 是 33(“域错误”)。
显然,我可以将其作为常量硬编码到 autodie
中,但这不是我想在这里做的,因为这意味着如果 errno 发生变化(或已经发生变化),我就完蛋了).我很想将它与 POSIX::EWOULDBLOCK
的 Windows 等效项进行比较,但我终究无法找到定义此类内容的位置。如果你能帮忙,请告诉我。
我特别不想要的答案:
- 建议将其硬编码为常量(或者更糟糕的是,留下一个 float 的魔数(Magic Number))。
- 在 Windows 下完全不支持
LOCK_NB
功能。 - 假设
LOCK_NB
调用flock
的任何失败都应该只返回 false。 - 我在 p5p 或 perlmonks 上提出的建议.我已经知道他们了。
- 解释
flock
、异常或Fatal
是如何工作的。我已经知道了。亲密地。
最佳答案
在 Win32“ native ”Perl 下,请注意 $^E 在 33 处更具描述性,“进程无法访问文件,因为另一个进程锁定了文件的一部分”,即 ERROR_LOCK_VIOLATION
(可用来自 Win32::WinError )。
关于windows - EWOULDBLOCK 相当于 Windows Perl 下的 errno,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/131473/