代码之家  ›  专栏  ›  技术社区  ›  Ian

Windows Perl下的ewouldBlock等效errno

  •  10
  • Ian  · 技术社区  · 16 年前

    G’day堆料机

    我是Perl的作者 autodie pragma,它更改Perl的内置组件,以便在失败时抛出异常。类似于 Fatal 但在词汇范围、可扩展的异常模型、更智能的返回检查以及更多更好的错误消息方面。它将取代 Fatal Perl未来版本中的模块(暂时为5.10.1+),但目前可以从CPAN for Perl 5.8.0及更高版本下载。

    的下一个版本 autodie 将为呼叫添加特殊处理 flock LOCK_NB (非阻塞)选项。失败时 一大群 调用通常会导致 自动冲模 ,调用失败 一大群 使用 洛克尼布 如果返回的错误号为( $! EWOULDBLOCK .

    原因是人们可以继续编写代码,比如:

    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.
    }
    

    在上面的代码中,由于其他人已经锁定了文件而失败的锁。( 块体 )不被认为是一个硬错误,因此自动生成 一大群 只返回一个错误值。在这种情况下,我们使用的文件系统不支持文件锁,或者网络文件系统和网络刚刚停止,然后自动生成 一大群 当它发现我们的errno不是 块体 .

    在我的开发版本中,这在Unix风格的系统上运行得很好,但在Windows下却失败了。虽然Windows下的Perl支持 洛克尼布 选项,它没有定义 块体 . 相反,当发生阻塞时,返回的errno是33(“域错误”)。

    显然,我可以把这个常量硬编码成 自动冲模 但这不是我想在这里做的,因为这意味着如果errno改变了(或者改变了),我就完蛋了。我想把它和相当于 POSIX::EWOULDBLOCK 但我一辈子都找不到这样的定义。如果你能帮忙,告诉我。

    我特别不想要的答案:

    • 建议将其硬编码为常量(或者更糟的是,留下一个浮动的幻数)。
    • 不支持 洛克尼布 在Windows下的所有功能。
    • 假设 洛克尼布 打电话给 一大群 只会返回错误。
    • 我在p5p或 perlmonks . 我已经知道了。
    • 如何解释 一大群 或例外,或 致命的 工作。我已经知道了。亲密地
    2 回复  |  直到 8 年前
        1
  •  11
  •   tye    16 年前

    在win32“native”perl下,请注意$^e在33时更具描述性,“由于另一个进程锁定了文件的一部分,进程无法访问该文件”,即 ERROR_LOCK_VIOLATION (可从 Win32::WinError )

        2
  •  5
  •   cjm    16 年前

    对于特定于Windows的错误代码,您要使用 $^E . 在本例中,它是33:“由于另一个进程锁定了文件的一部分,进程无法访问该文件”。( ERROR_LOCK_VIOLATION 在里面 winerror.h )

    不幸的是,我不认为 Win32::WinError 是核心。另一方面,如果微软对Windows错误代码重新编号,几乎所有写过的Windows程序都会停止工作,所以我认为硬编码不会有问题。

    推荐文章