草庐IT

windows - EWOULDBLOCK 相当于 Windows Perl 下的 errno

coder 2023-11-10 原文

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

有关windows - EWOULDBLOCK 相当于 Windows Perl 下的 errno的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. java - Ruby 相当于 Java 的 Collections.unmodifiableList 和 Collections.unmodifiableMap - 2

    Java的Collections.unmodifiableList和Collections.unmodifiableMap在Ruby标准API中是否有等价物? 最佳答案 使用freeze应用程序接口(interface):Preventsfurthermodificationstoobj.ARuntimeErrorwillberaisedifmodificationisattempted.Thereisnowaytounfreezeafrozenobject.SeealsoObject#frozen?.Thismethodretur

  8. python - Ruby 相当于 Python str[3 :] - 2

    是否有Ruby等效于Python的方法来获取在字符串末尾结束的子字符串,如str[3:]?必须输入字符串的长度并不方便。 最佳答案 传递最后一个元素=-1的范围str[3..-1] 关于python-Ruby相当于Pythonstr[3:],我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12978768/

  9. ruby - 如何在 Ruby 中执行 Windows CLI 命令? - 2

    我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解

  10. ruby - Java 8 相当于 ruby​​ each_with_index - 2

    我想知道,是否有一些流操作可以像ruby​​中的each_with_index那样做。其中each_with_index遍历值以及值的索引。 最佳答案 没有专门用于该目的的流操作。但您可以通过多种方式模仿该功能。索引变量:以下方法适用于顺序流。int[]index={0};stream.forEach(item->System.out.printf("%s%d\n",item,index[0]++));外部迭代:以下方法适用于并行流,只要原始集合支持随机访问。Listtokens=...;IntStream.range(0,toke

随机推荐