Windows Perl における EWOULDBLOCK と同等の errno
-
02-07-2019 - |
質問
スタックオーバーフラワーズ、
私は Perl の作者です オートダイ プラグマ。失敗時に例外をスローするように Perl の組み込みを変更します。似ていますね 致命的, ただし、字句スコープ、拡張可能な例外モデル、よりインテリジェントな戻り値チェック、およびはるかに優れたエラー メッセージを備えています。の代わりとなります。 Fatal
このモジュールは Perl の将来のリリース (暫定的に 5.10.1+) に組み込まれますが、現在は Perl 5.8.0 以降の CPAN からダウンロードできます。
次のリリースは、 autodie
への呼び出しに対する特別な処理が追加されます flock
とともに LOCK_NB
(非ブロッキング) オプション。失敗しながらも flock
通常、呼び出しは例外を引き起こします autodie
, 、への呼び出しに失敗しました flock
を使用して LOCK_NB
返された errno ($!
) は 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.
}
上記のコードでは、他の誰かがファイルをすでにロックしているためにロックが失敗します (EWOULDBLOCK
) はハードエラーとはみなされないため、自動染色 flock
単に false 値を返すだけです。ファイルロックをサポートしていないファイルシステム、またはネットワークファイルシステムを使用していて、ネットワークが停止した直後に自動的に停止する状況では、 flock
errno がそうでないことを確認した場合、適切な例外を生成します。 EWOULDBLOCK
.
これは、Unix 風味のシステム上の私の開発バージョンでは問題なく動作しますが、Windows ではひどく失敗します。Windows 上の Perl は、 LOCK_NB
オプション、それは定義しません EWOULDBLOCK
. 。代わりに、ブロックが発生した場合に返される errno は 33 (「ドメイン エラー」) です。
明らかに、これを定数としてハードコーディングできます。 autodie
, 、しかし、それは私がここでやりたいことではありません。errnoが変わる(または変わった)場合は、私が台無しになることを意味するからです。Windows に相当するものと比較してみたいと思います。 POSIX::EWOULDBLOCK
, 、しかし、そのようなことがどこで定義されるのか、私には一生見つかりません。お手伝いできることがあれば、お知らせください。
特に望んでいない答え:
- これを定数としてハードコードする (またはさらに悪いことに、マジック ナンバーを浮遊させたままにする) という提案。
- サポートしていません
LOCK_NB
Windows ではまったく機能しません。 - 何らかの障害が発生したと仮定すると、
LOCK_NB
に呼び出しますflock
単に false を返す必要があります。 - p5p または パールモンク. 。私は彼らのことをすでに知っています。
- 方法の説明
flock
, 、または例外、またはFatal
仕事。もう知っている。親密に。
解決
Win32 "ネイティブ" Perl では、$^E の 33 の「別のプロセスがファイルの一部をロックしたため、プロセスはファイルにアクセスできません」がより説明的であることに注意してください。 ERROR_LOCK_VIOLATION
(から入手可能 Win32::WinError).
他のヒント
Windows 固有のエラー コードの場合は、次を使用します。 $^E
. 。この場合は 33 です。「別のプロセスがファイルの一部をロックしているため、プロセスはファイルにアクセスできません」(ERROR_LOCK_VIOLATION
で winerror.h
).
残念ながらそうは思わない Win32::WinError コアにあります。一方、Microsoft が Windows エラー コードの番号を付け直した場合、これまでに作成されたほぼすべての Windows プログラムが動作しなくなるため、ハードコーディングしても問題はないと思います。