2017-06-01 840 views
-2

我想通过使用终端来中断(我不想杀死它)一个进程。目前,我能够停止该过程的唯一方法是通过物理轻击Ctrl + C。但是,为了我正在构建的程序,我不想点击Ctrl + C。有没有办法在Windows命令行上键入与轻击Ctrl + C相同的命令?我需要能够为我的程序做到这一点我使用paramiko发送cmd命令,但我不能在paramiko中使用ctrl + c。如何在Windows cmd行中模拟ctrl-c?

即CMD CTRL-C interrupt_this_program

+2

raise KeyboardInterrupt – Rosh

+0

@rosh在cmd行输入不起作用,因为raise不是一个可识别的命令。我该怎么办? –

+0

要发送控制台控制事件,首先必须通过'AttachConsole(target_pid)'连接到与目标进程相同的控制台。这是非控制台(GUI)应用程序最容易实现的,因为您一次只能连接到一个控制台。然后调用'GenerateConsoleCtrlEvent'来发送'CTRL_C_EVENT'。它针对的是一个进程组,比如Unix''killpg',所以最简单的方法就是通过发送到组0来将事件广播到所有连接的进程。最简单的方法是包含您自己的进程,因此请确保忽略进程中的Ctrl + C事件通过'SetConsoleCtrlHandler(NULL,TRUE)'。 – eryksun

回答

0

从命令行使用命令taskkill。通过在命令提示符窗口中运行获取有关此命令的帮助taskkill /?

taskkill而不使用选项/F的发送到指定的过程中的事件消息发送到终止,即WM_CLOSE message。如果应用程序编码为处理此一般Windows消息,则应尽快终止其自身并保存所有尚未保存的数据。

taskkill使用选项/F的真正杀死操作系统指定的进程(应用程序)不给运行的应用程序与保存所有数据,以终止自己的机会。因此,只有在应用程序未对终止消息作出响应时才应使用选项/F,因为未从操作系统接收该消息时编译为中断它的执行。

+0

假设目标进程有一个Ctrl + C处理程序,可以正常退出,但可以将其扩展为支持“CTRL_CLOSE_EVENT”。当通过WM_CLOSE关闭控制台时,它将这个事件发送给每个附加进程,并给它5秒处理事件并正常退出,之后它调用TerminateProcess来终止它。 – eryksun

+0

这里一个重要的警告是,当目标进程是控制台的控制进程(通常是创建控制台的进程)时,taskkill只会向控制台窗口发送一条“WM_CLOSE”消息。否则它将失败并报告使用'/ F'是必需的。所以你必须定位控制进程,这将终止连接到控制台的每个进程。 – eryksun

+0

控制台应用程序也可以选择创建隐藏窗口,以便能够直接接收“WM_CLOSE”消息,但控制台应用程序很少拥有一个窗口。他们通常只使用控制台,管道和文件提供的标准I/O。 – eryksun