9


6

「子プロセスはハンドルを継承できます」とはどういう意味ですか?

SDKによれば、特定のプロセスによって作成された子プロセスに「継承」できるWin32オブジェクトがいくつかあります。 (イベント、ミューテックス、パイプなど)

それは実際にはどういう意味ですか?

`CreateEvent`で作成された名前付きイベントオブジェクトがあるとします。

次に、子プロセスを開始します。 これらの2つのイベントハンドルは子プロセスにどのように影響しますか? どのシナリオで違いがありますか?

3 Answer


14


オブジェクトを作成/開き、そのハンドルの継承を許可すると、ハンドルの継承が許可されている子プロセス(例: CreateProcessに「bInheritHandles = TRUE」を指定すると、これらのハンドルのコピーが作成されます。 これらの継承されたハンドルは、親ハンドルと同じハンドル値を持ちます。 だから、例えば:

  • CreateEvent`はイベントオブジェクトへのハンドルを返します。ハンドルは 0x1234`です。

  • そのハンドルの継承を許可します。

  • ハンドルを継承する子プロセスを作成します。

  • その子プロセスは、呼び出す必要なしにハンドル `0x1234`を使用できるようになりました 「CreateEvent」または「OpenEvent」。 たとえば、子プロセスのコマンドラインでハンドル値を渡すことができます。

これは名前のないオブジェクトに役立ちます-名前のないオブジェクトのため、他のプロセスはそれらを開くことができません。 ハンドル継承子プロセスを使用すると、必要に応じて名前のないオブジェクトへのハンドルを取得できます。


2


既存の回答でなされていない点の1つは、子プロセスがハンドルを継承できるようにすることは、子プロセスだけに影響しないということです。また、ハンドルが参照するオブジェクトの存続期間にも影響する場合があります。 親プロセスが終了すると、子プロセスのハンドルはオブジェクトを存続させます。

子プロセスがハンドルを継承することを許可する場合、オブジェクトの寿命が本来より長くなるかどうかを考慮する必要があります。たとえば、一部のアプリケーションでは、一度に1つのインスタンスのみを実行できます。また、特定の名前でイベントオブジェクトを作成し、それが既に存在するかどうかを確認することもできます。 そのイベントオブジェクトを継承し、親よりも長生きする子プロセスを作成すると、誤検知が発生する可能性があります。

より一般的には、ファイルへの継承されたハンドルにより、ファイルが必要以上に長く使用されている(したがってアクセスできない)ことがあります。

このため、ベストプラクティスは次のとおりです。

  • 特に必要がない限り、すべてのハンドルを継承不可としてください 継承される

  • サブプロセスがハンドルを継承する必要がない場合は、 「bInheritHandles」。

  • サブプロセスがハンドルを継承する必要がある場合、 https://stackoverflow.com/a/28185363/886887 [必要な特定のハンドルのみを継承できるようにする]。

一方、これは時折便利です。たとえば、親プロセスのインスタンスとしてカウントする子プロセスを_want_した場合、または子が終了するまでファイルにアクセスできないままにする場合。 もう1つの方法は、子に名前付きオブジェクトのハンドルを継承させ、オブジェクトの存在または非存在を使用して、子がまだ生きているかどうかを判断することです。プロセスハンドルまたはプロセスIDを渡す必要はありません。


1


イベントを作成し、子プロセスがハンドルを継承できるようにすると、子プロセスは親が作成したものとまったく同じオブジェクトのハンドルを使用できます。 これは、子がイベントハンドルを使用して、タスクが完了したときに親に信号を送る方法で使用できます(継承可能なイベントオブジェクトハンドルには他にも多くの用途があります)。

編集:誤報を削除しました。