2016-10-25 8 views
1

ツリー内に3つのプロセスがあります:A - > B - > C. Aは私が所有していないホストアプリケーションですCreateProcessdwCreationFlags = 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ブロックをキャンセルしますか?

+1

プロセスBのControl-C処理を明示的に有効にするために 'SetConsoleCtrlHandler'を呼び出そうとしましたか? (設定は継承されます)。 –

答えて

1

ありがとうございました。どのような私のために働いたことは以下でした:

SetConsoleCtrlHandler(null, false); 
SetConsoleCtrlHandler(MyActualHandler, true); 

プロセスグループの事はSetConsoleCtrlHandler(null, true)を呼び出すことで動作し、あなただけの本物の1を追加する前に、デフォルトのハンドラを無効にするために持っているように見えます。

関連する問題