10

G'day Stackoverflowers,

私は、Perl のautodieプラグマの作成者です。このプラグマは、Perl のビルトインが失敗時に例外をスローするように変更します。これはFatalに似ていますが、レキシカル スコープ、拡張可能な例外モデル、よりインテリジェントなリターン チェック、およびはるかに優れたエラー メッセージを備えています。これは、Perl の将来のリリース (暫定的に 5.10.1+) でモジュールを置き換える予定Fatalですが、現在、Perl 5.8.0 以降の CPAN からダウンロードできます。

の次のリリースでは、(ノンブロッキング) オプションを使用したautodieへの呼び出しの特別な処理が追加されます。呼び出しが失敗すると、通常は例外が発生しますが、 usingの呼び出しが失敗すると、返された errno( ) が.flockLOCK_NBflockautodieflockLOCK_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.
}

上記のコードでは、他の誰かが既にファイルをロックしているために失敗したロック ( EWOULDBLOCK) は、ハード エラーとは見なされないため、autodyingflockは単に false 値を返します。ファイルロックをサポートしていないファイルシステムで作業している場合、またはネットワークファイルシステムとネットワークが停止したばかりの場合、エラー番号flockEWOULDBLOCK.

これは、Unix フレーバー システムの私の開発バージョンでは問題なく動作しますが、Windows ではひどく失敗します。Windows の Perl はこのLOCK_NBオプションをサポートしていますが、定義していないようEWOULDBLOCKです。代わりに、ブロッキングが発生した場合に返される errno は 33 (「ドメイン エラー」) です。

明らかに、これを定数として にハードコーディングできますautodieが、それはここでやりたいことではありません。私はそれを Windows の に相当するものと比較したいとPOSIX::EWOULDBLOCK思っていますが、そのようなものがどこで定義されるかを見つけることはできません。お手伝いできることがあれば、お知らせください。

特に望まない回答:

  • 定数としてハードコーディングすることを提案します (または、さらに悪いことに、マジック ナンバーを浮かび上がらせたままにします)。
  • LOCK_NBWindows では機能をまったくサポートしていません。
  • LOCK_NBへの呼び出しからの失敗は、flock単に false を返す必要があると仮定します。
  • p5p またはperlmonksで私が尋ねる提案。私はすでにそれらについて知っています。
  • flock、または例外、または機能の説明Fatal。もう知っている。親密に。
4

2 に答える 2

11

Win32の「ネイティブ」Perlでは、$ ^ Eが33でより説明的であることに注意してください。「別のプロセスがファイルの一部をロックしたため、プロセスはファイルにアクセスできません」 ( Win32 :: WinErrorERROR_LOCK_VIOLATIONから入手可能)。

于 2008-09-25T06:58:17.043 に答える
5

Windows 固有のエラー コードについては、$^E. この場合、それは 33 です: 「別のプロセスがファイルの一部をロックしているため、プロセスはファイルにアクセスできません」( ERROR_LOCK_VIOLATION) winerror.h

残念ながら、 Win32::WinErrorがコアにあるとは思いません。一方、Microsoft が Windows エラー コードの番号を付け直した場合、これまでに作成されたほとんどすべての Windows プログラムが動作しなくなるため、ハードコーディングすることに問題はないと思います。

于 2008-09-25T07:14:05.773 に答える