問題タブ [errno]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - Windows Perl での EWOULDBLOCK と同等の errno
G'day Stackoverflowers,
私は、Perl のautodieプラグマの作成者です。このプラグマは、Perl のビルトインが失敗時に例外をスローするように変更します。これはFatalに似ていますが、レキシカル スコープ、拡張可能な例外モデル、よりインテリジェントなリターン チェック、およびはるかに優れたエラー メッセージを備えています。これは、Perl の将来のリリース (暫定的に 5.10.1+) でモジュールを置き換える予定Fatal
ですが、現在、Perl 5.8.0 以降の CPAN からダウンロードできます。
の次のリリースでは、(ノンブロッキング) オプションを使用したautodie
への呼び出しの特別な処理が追加されます。呼び出しが失敗すると、通常は例外が発生しますが、 usingの呼び出しが失敗すると、返された errno( ) が.flock
LOCK_NB
flock
autodie
flock
LOCK_NB
$!
EWOULDBLOCK
これは、人々が次のようなコードを書き続けることができるようにするためです。
上記のコードでは、他の誰かが既にファイルをロックしているために失敗したロック ( EWOULDBLOCK
) は、ハード エラーとは見なされないため、autodyingflock
は単に false 値を返します。ファイルロックをサポートしていないファイルシステムで作業している場合、またはネットワークファイルシステムとネットワークが停止したばかりの場合、エラー番号flock
がEWOULDBLOCK
.
これは、Unix フレーバー システムの私の開発バージョンでは問題なく動作しますが、Windows ではひどく失敗します。Windows の Perl はこのLOCK_NB
オプションをサポートしていますが、定義していないようEWOULDBLOCK
です。代わりに、ブロッキングが発生した場合に返される errno は 33 (「ドメイン エラー」) です。
明らかに、これを定数として にハードコーディングできますautodie
が、それはここでやりたいことではありません。私はそれを Windows の に相当するものと比較したいとPOSIX::EWOULDBLOCK
思っていますが、そのようなものがどこで定義されるかを見つけることはできません。お手伝いできることがあれば、お知らせください。
特に望まない回答:
- 定数としてハードコーディングすることを提案します (または、さらに悪いことに、マジック ナンバーを浮かび上がらせたままにします)。
LOCK_NB
Windows では機能をまったくサポートしていません。LOCK_NB
への呼び出しからの失敗は、flock
単に false を返す必要があると仮定します。- p5p またはperlmonksで私が尋ねる提案。私はすでにそれらについて知っています。
flock
、または例外、または機能の説明Fatal
。もう知っている。親密に。
c - 単体テストのエラー条件 - EINTR
つまり、システム コールで EINTR などのエラー状態をどのように単体テストしますか。
私が取り組んでいる特定の例の 1 つは、(errno==EINTR) で EOF を返すときに fclose を再度呼び出す必要があるかどうかです。動作は、fclose の実装によって異なります。
EINTR が発生したときに fp が解放された場合、この呼び出しは安全ではない可能性があります。when (errno==EINTR) のエラー処理をテストするにはどうすればよいですか?
errno - 投げる、返す、またはエラーする?
システムを作っています。私が知りたいのは、メッセージがサポートされていない場合、どうすればよいですか? サポートされていないメッセージをスローする必要がありますか? 0 または -1 を返す必要がありますか? または、errno (base->errno_) を設定する必要があります。エラーがあったとしても気にしないいくつかのメッセージ (setBorderColour など)。その他(addTextまたは保存コマンドを作成する場合はおそらく保存)。
1) 迅速にコーディングする 2) デバッグする 3) 拡張および保守するための最良の方法を知りたいです。ATM をデバッグするのは難しいですが、私が記入しなかった多くの欠落コードがあります。実際のバグを修正するのは難しくありません。エラーがあることをユーザーに知らせる最善の方法は何ですか?
システムはこのように機能しますが、まったく同じではありません。これは C スタイルで、mycode には settext(const char*text){ を msg(this, esettext, text) にラップする一連のインライン関数があります。
c - マルチスレッドアプリケーションで errno を安全に使用する方法はありますか?
errno を使用してエラーの種類を示すシステム/ライブラリ呼び出しを使用するマルチスレッド アプリケーションを作成している場合、errno を安全に使用する方法はありますか? そうでない場合、エラーが発生したというだけでなく、発生したエラーの種類を示す別の方法はありますか?
c - 「errno」の意味を知る方法は?
を呼び出すとexecl(...)
、errno=2
. どういう意味ですか?これの意味をどうやって知ることができerrno
ますか?
python - Python から errno にアクセスしますか?
私は、有用なエラー コードを返さないかなり複雑な Python モジュールに悩まされています (実際には、不穏なほど静かに失敗します)。ただし、それが呼び出す基になる C ライブラリは errno を設定します。
通常、errno は OSError 属性を超えて入ってきますが、例外がないため、取得できません。
ctypes を使用すると、errno は GNU libc のマクロであるため、libc.errno は機能しません。Python 2.6 にはいくつかのアフォーダンスがありますが、Debian はまだ Python 2.5 を使用しています。errno を読み取るためだけに純粋な Python プログラムに C モジュールを挿入すると、うんざりします。
errno にアクセスする方法はありますか? ラップされるライブラリは Linux 専用であるため、Linux 専用のソリューションで問題ありません。スレッドについても心配する必要はありません。スレッドが失敗する可能性がある間は 1 つのスレッドしか実行していないからです。
visual-studio - EDQUOT に相当する Windows はありますか?
現在のユーザーのディスク クォータを超えようとして失敗したことを示す EDQUOT エラーの発生を検出する C++ コードを UNIX から Windows に移植しています。Windows にディスク クォータ機能があることはわかっていますが、Visual Studio の <errno.h> には EDQUOT がありません。Visual Studio の <errno.h>にはENOSPC があります。これは、UNIX が EDQUOT として表現するものを CRT が表現する方法である可能性があります。この理論を肯定または否定できる人はいますか? そして、これがこれを処理する方法ではない場合、何ですか?
c++ - errno と相互作用する関数のリストはどこで確認できますか?
本「The C Programming Language」では、次のように述べています。
「ライブラリ内の関数の多くは、エラーまたはファイルの終わりが発生したときにステータス インジケータを設定します。これらのインジケータは、明示的に設定およびテストできます。さらに、
errno
(で宣言された<errno.h>
) 整数式には、最も詳細な情報を提供するエラー番号が含まれる場合があります。最近のエラー。」
これらの関数のリストはどこで確認できますか?
python - IOError の errno を取得するには?
C には perror と errno があり、最後に発生したエラーを出力して保存します。これは、呼び出しが失敗した理由をユーザーに提示するために fopen() の引数として失敗したすべてのファイルを fstat() する必要がないため、ファイル io を実行するときに便利です。
PythonでIOError例外を適切に処理するときにerrnoを取得する適切な方法は何だろうと思っていましたか?
c++ - errno_t が定義されているかどうかを検出する方法は?
Visual C++ 2008 の gcc を使用してコードをコンパイルしています。コードは errno_t を使用していますが、gcc ヘッダーの一部のバージョンでは<errno.h>
、型が定義されていません。型が定義されているかどうかを検出するにはどうすればよいですか? 型が定義されたことを知らせる定義はありますか? 定義されていない場合は、すべてのプラットフォームでコードを正しくコンパイルできるように typedef を提供したいと思います。