在 Windows 中发送任意信号?

新手上路,请多包涵

Linux 支持发送任意 Posix 信号,例如 SIGINTSIGTERM 到使用 kill 命令的进程。虽然 SIGINTSIGTERM 只是无聊的旧方法,以友好或不那么友好的方式结束进程, SIGQUIT 核心转储。这可用于触发正在运行的 Java VM 打印出线程转储,包括所有正在运行的线程的堆栈跟踪——整洁!打印调试信息后,Java VM 将继续执行它之前正在执行的操作;事实上,线程转储只是发生在另一个具有最高优先级的衍生线程中。 (您可以自己尝试使用 kill -3 <VM-PID> 。)

请注意,您还可以使用(不受支持!) SignalSignalHandler 中的类注册自己的信号处理程序—8e8d9b0a85fa4d27d9073599b-3-f20c6,so sun.misc 玩得开心。

但是,我还没有找到向 Windows 进程发送信号的方法。 信号由某些用户输入创建: Ctrl-C 例如在两个平台上触发 SIGINT 。但是似乎没有任何实用程序可以手动向 Windows 上正在运行但非交互的进程发送信号。显而易见的解决方案是使用 Cygwin kill 可执行文件,但虽然它可以使用适当的 Windows API 结束 Windows 进程,但我无法发送 SIGBREAK (Windows 等同于 SIGQUIT ) 用它;事实上,我认为它能够发送到 Windows 进程的唯一信号是 SIGTERM

因此,长话短说并重复标题:如何向 Windows 中的进程发送任意信号?

原文由 morsch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

如果你想要明确地/以编程方式杀死任何类型的另一个程序/进程,在 SysInternals 的 pstools 中有一个名为“pskill”的小工具,其行为就像 Unixen 的“kill”一样。

如果你想要其他东西,请继续阅读(尽管我在下面的一些细节上可能是错误的 - 自从我上次仅使用 WinAPI 和 Charles Petzold 的优秀书籍“Programming for Windows”作为指南用 C 语言开发 Windows 程序以来已经过了很久).

在 Windows 上,您没有正确的“信号”,WinMain 和 WinProc 从操作系统接收的功能是简单的 _消息_。例如,当您单击窗口的“X”按钮时,Windows 会向该窗口的处理程序发送消息 WM_CLOSE。当窗口被删除但程序仍在运行时,它发送 WM_DESTROY。当它即将跳出主消息处理循环时,WinMain(不是 WinProc)收到 WM_QUIT。您的程序应该按预期响应所有这些 - 您实际上可以通过在收到 WM_CLOSE 时不做它应该做的事情来开发一个“不可关闭”的应用程序。

当用户从 Windows 任务管理器中选择任务并单击“结束任务”时,操作系统将发送 WM_CLOSE(还有另一个我不记得了)。但是,如果您使用“结束进程”,则该进程会直接终止,不会发送任何消息(来源: The Old New Thing

我记得有一种方法可以获取另一个进程窗口的 HWND,一旦您知道另一个进程可以通过函数 PostMessage 和 DispatchMessage 向该窗口发送消息。

原文由 Joe Pineda 发布,翻译遵循 CC BY-SA 4.0 许可协议

Windows 不是 POSIX。它没有信号。控制台程序获得的唯一“信号”是它们调用 SetConsoleCtrlHandler ,在这种情况下,可以通知它用户已按下 Ctrl+C、Ctrl+Break、关闭控制台窗口、注销或关闭系统。

其他一切都是通过 IPC 完成的,通常是通过窗口消息或 RPC。查看 Sun 的文档,看看是否有办法在 Windows JRE 上执行您要求的操作。

原文由 Mike Dimmick 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题