2011-07-05 13 views
7

Microsoftはここで安全にプレーしました。 "Creating a Child Process with Redirected Input and Output"で、後で子プロセスが所有する継承されたハンドルを閉じる必要がありますか?

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

これは完全に役に立たないものです。何が処理されますか?どのプロセスですか?


私はその周りに頭を浮かべたい。

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

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

hReadハンドルを子プロセスに渡してパイプから読み込み、子プロセスがハンドルを閉じると、も親プロセスから閉じなければなりませんか?子プロセスの下からパイプを拭き取ることはできませんか?

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

答えて

10

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

この時点では、少なくとも2つのカーネルオブジェクトへの参照があり、オブジェクトのロックを解除し、消費されたリソースを解放します。

+0

Ah。子プロセスを生成するとハンドル*がクローン化されます。それは私が後にしたものです。 – GSerg

関連する問題