windows - EWOULDBLOCK 相当于 Windows Perl 下的 errno

标签 windows perl magic-numbers errno

你好 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/

相关文章:

c++ - 线程安全的 Hook 函数

regex - 超过复杂正则子表达式递归限制 (32766)

java - 即使文件扩展名已更改,如何识别文件类型?

java - setbounds 值是魔数(Magic Number)

c++ - 这些会被认为是神奇的数字吗?

windows - 基于Windows的GKE中的ContainerD节点

c++ - 如何在应用程序通过任务管理器被杀死时保存数据?

c++ - 在另一台计算机上运行代码时找不到内容(图像/声音)c++

perl - Perl 中的数组排序

perl - ONE::Timer 不调用子例程