親プロセスを強制終了すると子プロセスが自動的に強制終了されるようにCreateProcessを呼び出す方法はありますか?
おそらく、プロセスフラグの作成を使用していますか?
編集
解決策は、ジョブオブジェクトを作成し、親と子の両方をジョブオブジェクトに配置することです。彼の親が殺されるとき、子供は殺されます。ここからコードを取得しました。
親プロセスが強制終了されたときに子プロセスを
強制終了します。継承されたハンドルに関する@wilxのコメントに注意してください。
親プロセスを強制終了すると子プロセスが自動的に強制終了されるようにCreateProcessを呼び出す方法はありますか?
おそらく、プロセスフラグの作成を使用していますか?
編集
解決策は、ジョブオブジェクトを作成し、親と子の両方をジョブオブジェクトに配置することです。彼の親が殺されるとき、子供は殺されます。ここからコードを取得しました。
親プロセスが強制終了されたときに子プロセスを
強制終了します。継承されたハンドルに関する@wilxのコメントに注意してください。
ニールが言うように仕事を使うことは私見が最善の方法です。JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
を使用してジョブオブジェクトを設定することにより、ジョブ所有プロセスが終了したときに子プロセスを強制終了することができますSetInformationJobObject()
。親プロセスが終了/終了すると、ジョブオブジェクトハンドルは閉じられます。これが機能するためには、ジョブハンドルが子プロセスに継承されないことが不可欠です。孫プロセスも追跡する場合は、一時停止された子プロセスを作成し、それらをジョブオブジェクトに追加してから、実行させる必要があります。
最善の方法は、両方のプロセスを同じジョブに入れて、ジョブを強制終了すると両方のプロセスが強制終了されるようにすることです。
子プロセスを強制終了する必要がありますか、それとも親プロセスの終了を検出して正常に終了できるようにする必要がありますか?親プロセスは、それ自体への継承可能なハンドルを作成でき、子はそれをWaitForMultipleObjects(Ex)
独自のオブジェクトと一緒に渡すことができます。
子プロセスがこのために特別に作成されていない場合は、そのstdinをパイプに接続できます。パイプのもう一方の端は、親プロセスによって保持されます。親が死亡した場合、パイプは自動的に閉じられます。
これは、親が死んだときに子が殺されないというUnixの動作と密接に類似しており、通常はそれに応じて終了しますSIGHUP
(ただし、そのシグナルを処理し、任意の動作を実装できます)。Linuxでは、孤立した親PIDが1(init)に変更されます。
別のアプローチ
すべての状況で役立つわけではありませんが、アプリケーションが子プロセスを完全に制御しているという特定のシナリオがありました。通信とAPIインターセプトでは、DLLインジェクションが必要だったため、DLLは実際の子プロセスで実行され、親に報告されます。
注:現在、これは創造性賞ではありません。ここでの背景は次のとおりです。ラップする必要があるアプリケーションですが、それはレガシーアプリケーションであり、変更したり、満足のいく方法で書き直したりすることはできませんでした。このシステムからの出力をインターセプトしながら、このシステムを実行し続ける必要がありました。
また、子プロセスの記述が不十分で、すぐに再起動してから終了するため、親プロセスは実際にはメインアプリケーションではありません。
子プロセスを制御し、とにかくDLLが挿入されている場合は、親プロセスを監視して実行されているかどうかを確認することで、このDLLを拡張できます。そうでない場合は、ExitProcess
。
子プロセスでDLLが必要ない場合は、他のソリューションの方がはるかに優れている可能性があります。
parentProcessID
たとえば、アプリケーションですでに使用しているレジストリキーを介して転送できます。または、子プロセスを中断しない場合は、コマンドラインを渡すことができます。
これは、独自のスレッドで実行する必要があります。私のDLLには2つのスレッドがありました。このコードと制御および通信コードです。
DLL
bool IsProcessRunning(HANDLE hProcess)
{
DWORD exitCode;
GetExitCodeProcess(hProcess, &exitCode);
return exitCode == STILL_ACTIVE;
}
bool WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
int parentProcessID = [...]
HANDLE parentProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, parentProcessID);
while (IsProcessRunning(parentHandle)) Sleep(100);
ExitProcess(0);
}
return true;
}
私は、ほとんど偶然の副作用としてそれを行うDEBUG_PROCESS
と思います。DEBUG_ONLY_THIS_PROCESS
ただし、Windowsは、Unixライクなシステムのようにツリー内にプロセスを作成しません。
Windowsについてはわかりませんが、これはLinuxで機能します。prctl(PR_SET_PDEATHSIG、SIGHUP);