質問

スタックオーバーフラワーズ、

私は 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_VIOLATIONwinerror.h).

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top