10

マイクロソフトはここで安全にプレーしました。彼らの記事「Creating a Child Process with Redirected Input and Output」では、次のように述べています。

このプロセスが終了すると、残りの開いているハンドルがクリーンアップされます。
大規模なアプリケーションでのリソース リークを回避するには、ハンドルを明示的に閉じます。

これはまったく役に立たない。ハンドルは?どのプロセスで?


頭を整理したい。

を使用して親プロセスでハンドルが作成されるとSECURITY_ATTRIBUTES.bInheritHandle = TRUE、子プロセスはそれを参照して使用でき、ハンドルは両方のプロセスで同じ値とアクセス権を持ちます。

しかし、それは同じハンドルですか、それともたまたま同じ数値表現を持つコピーですか?

hReadパイプから読み取れるように子プロセスにハンドルを渡し、子プロセスがハンドルを閉じる場合、親プロセスからもハンドルを閉じる必要がありますか? 子プロセスの下からパイプをワイプしませんか?

私の実験では、子がハンドルを閉じた後に子に渡されCloseHandleたハンドルを閉じようとすると、成功が返されます。hReadこれは、はい、閉じる必要があることを強く主張しています。ただし、ここでより堅実なアドバイスをいただければ幸いです。

4

1 に答える 1

12

そこで頭に釘を打ちます。Win32 ハンドルは、基になるカーネル モード オブジェクトへのユーザー モード参照として機能します。新規および既存のオブジェクトへのハンドル (参照) は通常、何らかの CreateXXX 呼び出しによって作成されます。DuplicateHandle を呼び出すことによって、現在のプロセスまたは他のプロセスで追加の参照を作成できます。{または、ハンドルを継承可能としてマークし、新しいプロセスを作成します。現在のプロセスから子プロセスにハンドルを複製し、ハンドル値が同一であることを確認します。}

その時点で、カーネル オブジェクトへの (少なくとも) 2 つの参照があり、両方を閉じてオブジェクトのロックを解除し、消費されたリソースを解放する必要があります。

于 2011-07-05T10:28:44.573 に答える