ツリー内に3つのプロセスがあります:A - > B - > C. Aは私が所有していないホストアプリケーションですCreateProcess
とdwCreationFlags = CREATE_NEW_PROCESS_GROUP
B. Bは私のサービスで、CはJavaの子プロセスでCreateProcess
を使用して生成し、Ctrl + Cを押してシャットダウンフックをトリガーすることができます。ホストがCREATE_NEW_PROCESS_GROUPで作成されたときにCtrl + Cを子プロセスに送信
MSDN上のプロセスの作成フラグ・ページによると、CREATE_NEW_PROCESS_GROUP
フラグはすべての子プロセスのためにはCtrl + Cを無効にします。
新しいプロセスは新しいプロセスグループのルートプロセスです。プロセスグループには、このルートプロセスの子孫であるすべてのプロセスが含まれます。新しいプロセスグループのプロセス識別子は、lpProcessInformationパラメータで返されるプロセス識別子と同じです。プロセスグループは、GenerateConsoleCtrlEvent関数によって使用され、CTRL + BREAK信号をコンソールプロセスのグループに送信できるようにします。このフラグを指定すると、新しいプロセスグループ内のすべてのプロセスでCTRL + Cシグナルが無効になります。
この動作を回避して、プロセスCにCtrl + C信号を送信できるようにする必要があります。これはJavaプロセスであり、Ctrl + Breakは処理できません。トリガーシャットダウン。私はCREATE_NEW_CONSOLE
でプロセスCを作成しようとしました。これは新しいコンソールがすべてのシグナルを受け取ることができるが、Ctrl + Cもブロックされているという前提で行いました。 CREATE_NEW_PROCESS_GROUP
を無効にするかバイパスする方法があるか知っていますか?このCtrl + Cブロックをキャンセルしますか?
プロセスBのControl-C処理を明示的に有効にするために 'SetConsoleCtrlHandler'を呼び出そうとしましたか? (設定は継承されます)。 –