継承
子プロセスは、親プロセスから複数のプロパティとリソースを継承できます。 また、子プロセスが親プロセスからプロパティを継承しないようにすることもできます。 次のコードを継承できます。
- CreateFile 関数によって返されるオープン ハンドル。 これには、ファイルへのハンドル、コンソール入力バッファー、コンソール画面バッファー、名前付きパイプ、シリアル通信デバイス、および mailslot が含まれます。
- 処理するハンドル、スレッド、ミューテックス、イベント、セマフォ、名前付きパイプ、匿名パイプ、およびファイル マッピング オブジェクトを開きます。 これらは、CreateProcess、CreateThread、createMutex、CreateEvent、CreateSemaphore、CreateNamedPipe、CreatePipe、および CreateFileMapping関数によって返されます。
- 環境変数。
- 現在のディレクトリ。
- プロセスがデタッチされているか、新しいコンソールが作成されていない限り、コンソール。 子コンソール プロセスは、親の標準ハンドルと、入力バッファーとアクティブな画面バッファーへのアクセスを継承することもできます。
- SetErrorMode 関数によって設定されるエラー モード。
- プロセッサ アフィニティ マスク。
- ジョブとの関連付け。
子プロセスは以下を継承しません。
- Priority クラス。
- LocalAlloc、globalAlloc、HeapCreate、および HeapAllocによって返されるハンドル。
- GetCurrentProcess または GetCurrentThread関数によって返されるハンドルと同様に、擬似ハンドル。 これらのハンドルは、呼び出し元のプロセスに対してのみ有効です。
- LoadLibrary 関数によって返される DLL モジュール ハンドル。
- GDI またはユーザー ハンドル (HBITMAP 、HMENU など)。
ハンドルの継承
子プロセスは、親のハンドルの一部を継承できますが、他のハンドルを継承することはできません。 ハンドルを継承するには、次の 2 つの操作を行う必要があります。
- ハンドルを作成、開く、または複製するときにハンドルを継承するように指定します。 作成関数では、通常、この目的のために、SECURITY_ATTRIBUTES 構造体の bInheritHandle メンバーが使用されます。 DuplicateHandleは、bInheritHandles パラメーターを使用します。
- CreateProcess 関数を呼び出すときに、bInheritHandles パラメーターを TRUE に設定して、継承可能なハンドルを継承するように指定します。 さらに、標準入力、標準出力、標準エラー ハンドルを継承するには、STARTUPINFO 構造体の dwFlags メンバーにSTARTF_USESTDHANDLESが含まれている必要があります。
特定の子プロセスによって継承されるハンドルの一覧を指定するには、UpdateProcThreadAttribute 関数を PROC_THREAD_ATTRIBUTE_HANDLE_LIST フラグで呼び出します。
継承されたハンドルは、親プロセスと同じオブジェクトを子プロセスで参照します。 また、値とアクセス権限も同じです。 したがって、1 つのプロセスがオブジェクトの状態を変更すると、その変更は両方のプロセスに影響します。 ハンドルを使用するには、子プロセスはハンドル値を取得し、それが参照するオブジェクトを "認識" する必要があります。 通常、親プロセスは、コマンド ライン、環境ブロック、または何らかの形式のプロセス間通信 を介して、この情報子プロセスに通信します。
SetHandleInformation 関数を使用して、既存のハンドルが継承可能かどうかを制御します。
環境変数の継承
子プロセスは、既定で親プロセスの環境変数を継承します。 ただし、CreateProcessでは、親プロセスで別の環境変数ブロックを指定できます。 詳細については、「環境変数の」を参照してください。
現在のディレクトリの継承
GetCurrentDirectory 関数は、呼び出し元プロセスの現在のディレクトリを取得します。 子プロセスは、既定で親プロセスの現在のディレクトリを継承します。 ただし、CreateProcessを使用すると、親プロセスで子プロセス用に別の現在のディレクトリを指定できます。 呼び出し元プロセスの現在のディレクトリを変更するには、SetCurrentDirectory 関数を使用します。