6

CloseHandle を複数回呼び出すことの意味は何ですか?

ドキュメントには「すべきではない」と書かれていますが、ハンドルが外部から閉じられる可能性がある名前付きパイプの現実的なケースがあると思います (投稿の最後を参照)。

この場合、CloseHandle はデバッグ モードで例外をスローします。これは、開発者がこれを深刻だと考えていることを示唆していますが、ドキュメントは正確には明確ではありません。

(丁寧なお願い: 「やめてください!」という回答は避けてください :-)。もちろん、handke を 2 回以上閉じることは避けるべきです。もちろん、これを支援する優れたテクニックがあります: 閉じないとどうなるかだけに興味があります)。

ハンドルが OS によってすぐに再利用された場合、別の別のハンドルを閉じてしまう可能性があると示唆する人がいると聞いたことがあります。

これはありそうですか?

Windows はハンドル ID をどのように選択しますか?

ハンドル値が再利用される頻度について保証はありますか?

(たとえば、TCP はポート番号が特定の時間枠内で再利用できないことを保証します)。

ハンドル タイプ間でハンドルを閉じることはできますか? たとえば、パイプを閉じていると思っていたのに、イベントを閉じてしまうことはありますか?

ありがとう!

ジョン

(これに対するコンテキスト: クライアント/サーバー モデルで名前付きパイプを使用しています。たとえば、プロセスのクラッシュ/強制終了の場合など、ハンドルを閉じることを保証するのは非常に難しいようです。おそらく私は間違っています。 、しかし確かにMSDNのサンプルコードは、クライアントが共有ハンドルを閉じることを許可するように思われ、サーバーがそれを閉じようとすると、すでに閉じられています)。

4

3 に答える 3

12

簡単に確認できます:

HANDLE h = 0;
h = CreateMutex(NULL, TRUE, NULL);
printf("%X\n", h);
CloseHandle(h);
h = 0;
h = CreateMutex(NULL, TRUE, NULL);
printf("%X\n", h);

私のWinXP x64では、これが生成されました:

2E8
2E8

それで、あなたはそれを持っています。
TCP ポートとは異なり、ハンドルはすぐにリサイクルされます。

お気に入りの API またはそれらの任意の組み合わせを使用して、この実験を繰り返します。

于 2010-07-05T11:22:07.510 に答える
4

おそらくあなたは、パイプに対して間違ったイメージを持っているでしょう。これには 2 つの端があり、それぞれが異なるハンドルで表されます。はい、パイプ インスタンスを非表示にするには、CloseHandle を 2 回呼び出す必要があります。しかし、それらはハンドルが異なるため、問題が発生することはありません。また、ハンドル インスタンスはプロセス固有であることに注意してください。両方のプロセスで同じ値を持っていても、同じパイプ エンドポイントを参照していません。

于 2010-07-05T12:00:06.073 に答える
1

次の 2 つのことが考えられます。

  1. 他のコードによって開かれたハンドルを閉じます。それはおそらくあなたのコードには影響しませんが、他のコードにとっては壊滅的である可能性があります.
  2. デバッガーをアタッチして実行している場合、無効なハンドルが閉じられていることを OS が検出すると例外が発生するため、アプリケーションがクラッシュします。

これらはどちらも特に魅力的な私見ではありません。

于 2010-07-05T18:50:56.820 に答える