2017-06-01 20 views
-2

私は、ターミナルを使ってプロセスを中断したい(私はそれをやめたくない)。現在、プロセスを停止できる唯一の方法は、Ctrl + Cを物理的にタップすることです。しかし、私が作成しているプログラムのために、Ctrl + Cをタップする必要はありません。 WindowsのコマンドラインでCtrl + Cをタップするのと同じことをするコマンドを入力する方法はありますか?私は私のプログラムのためにこれを行うことができる必要があります私はcmdコマンドを送信するためにparamikoを使用していますが、私はparamikoでctrl + cを使うことはできません。Windowsのcmd行でctrl-cをシミュレートする方法は?

すなわちCMD CTRL-Cコマンドライン用コマンドtaskkillからinterrupt_this_program

+2

raise KeyboardInterrupt – Rosh

+0

raiseは認識可能なコマンドではないので、cmd行で入力した@roshは機能しません。私は何をしますか? –

+0

コンソールコントロールイベントを送信するには、最初に 'AttachConsole(target_pid)'を介してターゲットプロセスと同じコンソールにアタッチする必要があります。これは一度に1つのコンソールにしか接続できないため、非コンソール(GUI)アプリケーションから行うのが最も簡単です。次に 'GenerateConsoleCtrlEvent'を呼び出して' CTRL_C_EVENT'を送ります。これはUnixの 'killpg'のようなプロセスグループを対象としているので、グループ0に送信することで、接続されているすべてのプロセスにイベントをブロードキャストするのが最も簡単です。もちろん、自分のプロセスが含まれているので、プロセスのCtrl + 'SetConsoleCtrlHandler(NULL、TRUE) 'を介して。 – eryksun

答えて

0

。コマンドプロンプトウィンドウtaskkill /?で実行して、このコマンドのヘルプを表示します。オプション/Fの使用せず

taskkill

、すなわちWM_CLOSE messageを終了に指定されたプロセスにイベントメッセージを送信します。アプリケーションがこの一般的なWindowsメッセージを処理するようにコーディングされている場合は、保存されていないデータをすべて保存してできるだけ早く終了する必要があります。オプション/F用法

taskkill本当には、実行中のアプリケーションにすべてのデータを保存して、それ自体を終了する機会を与えることなく、オペレーティング・システムによって指定されたプロセス(アプリケーション)を殺します。したがって、オペレーティングシステムからのメッセージの受信時に実行を中断するようにコード化されていないため、アプリケーションが終了メッセージで応答しない場合にのみ、オプション/Fを使用する必要があります。

+0

おそらく、ターゲットプロセスには正常な終了を行うCtrl + Cハンドラがありますが、これを拡張して 'CTRL_CLOSE_EVENT'もサポートすることが可能です。コンソールが 'WM_CLOSE 'を介して閉じられると、このイベントは各接続されたプロセスに送信され、イベントを処理して正常に終了するまで5秒間与えられ、その後TerminateProcessを呼び出して終了します。 – eryksun

+0

ここで重要な注意点は、ターゲットプロセスがコンソールの制御プロセス(通常はコンソールを作成したプロセス)である場合にのみタスクキルがコンソールウィンドウに 'WM_CLOSE'メッセージを送信することです。それ以外の場合は失敗し、 '/ F'を使用する必要があることを報告します。したがって、制御プロセスをターゲットにする必要があります。これにより、コンソールに接続されているすべてのプロセスが終了します。 – eryksun

+0

コンソールアプリケーションには、WM_CLOSEメッセージを直接受信できる隠しウィンドウを作成するオプションもありますが、コンソールアプリケーションがウィンドウを所有することはまれです。通常、コンソール、パイプ、およびファイルによって提供される標準I/Oでのみ動作します。 – eryksun

関連する問題