2017-02-17 4 views
4

私はコマンドラインアプリケーションを作成しています。これはプロセス(ユーザーが定義したコマンド、通常はHTTPサーバー)を生成し、アプリケーションのジョブが完了したらプロセスは終了すべきであることを知っている。Windowsでコマンドラインアプリケーションを正常に終了する

UNIXでは、SIGTERMを送信することでこれを行うことができます。プロセスが終了しない場合は、残念ながらSIGKILLによってkillすることができます。

Windowsでは、SIGTERMシナリオの代替案を見つけるのに苦労します。私は、したがって、私はそれをテストすることはできません、taskkill /PID XXXXは、ボンネットの下に何をするかについての情報を発見した(!/fなし)taskkill /PID XXXXがあります学んだが、

  1. taskkill /PID XXXXがプロセス側から送信したものをどのように処理するのか分かりません。
  2. cmd.exeのコマンドでは動作しないようです。私はそれを、1 cmd.exeに単純なサーバー・プロセスを実行taskkill /PID XXXXに別のウィンドウでそのPIDとを取得しようとしましたが、それを行うにはtaskkill断っ:ERROR: The process with PID XXXX could not be terminated. Reason: This process can only be terminated forcefully (with /F option).

だから私の質問は:コマンドラインプロセスを通知する方法Windowsでは、強制終了せずに終了する必要がありますか?終了する側のプロセスでこのようなメッセージを受信して​​処理する方法は?

答えて

3

GenerateConsoleCtrlEventは、ユーザーがCtrl + CまたはCtrl + Breakを押したかのようにコンソールアプリケーションに通知します。コンソールアプリケーションはこれらのシグナルを無視することができます(SetContolCtrlHandlerを使用)が、デフォルトでは、ExitProcessを実行するだけです。

これは、ユーザーがコンソールウィンドウを閉じる、ログオフする、またはシャットダウンするときにWindowsが使用するのと同じ信号です。

+0

これらの信号をJavaScript(node.js)などのプログラミング言語から送信するにはどうすればよいですか? –

+0

@HonzaJavorek:申し訳ありませんが、私はしません。たぶんあなたは質問に適切な言語タグを追加して、知っている人に質問に気づかせるべきでしょう。 –

3

TaskKillは、プロセスに可視ウィンドウがある場合はPostMessage(hwnd, WM_CLOSE, 0, 0);(基本的にはXをウィンドウで押すのと同じです)を使います。

アプリケーションがコンソールアプリケーションであることがわかっている場合は、代わりにGenerateConsoleCtrlEventを使用できます。

関連する問題