【问题标题】:How to simulate ctrl-c in Windows cmd line?如何在 Windows cmd 行中模拟 ctrl-c?
【发布时间】:2017-11-03 06:21:34
【问题描述】:

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

即cmd ctrl-c interrupt_this_program

【问题讨论】:

  • 提高键盘中断
  • @rosh 在 cmd 行中键入该内容不起作用,因为 raise 不是可识别的命令。我该怎么办?
  • 要发送控制台控制事件,您首先必须通过AttachConsole(target_pid) 附加到与目标进程相同的控制台。这是从非控制台 (GUI) 应用程序中最容易做到的,因为您一次只能附加到一个控制台。然后致电GenerateConsoleCtrlEvent 发送CTRL_C_EVENT。这针对一个进程组,例如 Unix killpg,因此通过发送到组 0 将事件广播到所有附加进程是最简单的。当然这包括您自己的进程,因此请确保忽略进程中的 Ctrl+C 事件通过SetConsoleCtrlHandler(NULL, TRUE).
  • 最近有人遇到了类似的问题。也许the same method 适合你。

标签: python ssh cmd process paramiko


【解决方案1】:

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

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

taskkill with 使用选项/F 真的杀死操作系统指定的进程(应用程序),而不给正在运行的应用程序以终止自身的机会保存所有数据。所以选项/F 应该只在应用程序没有响应终止消息时才应该使用,因为没有被编码以在从操作系统接收到该消息时中断其执行。

【讨论】:

  • 可能目标进程有一个 Ctrl+C 处理程序可以优雅地退出,但可以扩展它以支持CTRL_CLOSE_EVENT。当控制台通过WM_CLOSE 关闭时,它会将此事件发送给每个附加的进程,并给它 5 秒的时间来处理事件并优雅退出,然后调用TerminateProcess 将其杀死。
  • 这里的一个重要警告是,当目标进程是控制台的控制进程(通常是创建控制台的进程)时,taskkill 只会向控制台窗口发送WM_CLOSE 消息。否则它将失败并报告需要使用/F。因此,您必须针对控制进程,这将终止连接到控制台的每个进程。
  • 控制台应用程序还可以选择创建一个隐藏窗口,以便能够直接接收WM_CLOSE 消息,但控制台应用程序很少拥有一个窗口。它们通常仅适用于控制台、管道和文件提供的标准 I/O。
猜你喜欢
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 2014-11-22
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多