当前位置:  开发笔记 > 编程语言 > 正文

在Windows中发送任意信号?

如何解决《在Windows中发送任意信号?》经验,为你挑选了2个好方法。

Linux支持使用-Command 将任意Posix-Signal发送到进程SIGINTSIGTERM发送到进程kill.虽然SIGINT并且SIGTERM只是无聊的方式以友好或不那么友好的方式结束流程,但SIGQUIT意味着触发核心转储.这可以用来触发正在运行的Java VM打印出一个线程转储,包括所有正在运行的线程的堆栈跟踪 - 整洁!打印完调试信息后,Java VM将继续执行以前的操作; 事实上,线程转储只发生在另一个具有最高优先级的衍生线程中.(您可以通过使用自己尝试kill -3 .)

请注意,您也可以使用(不支持的!)Signal和-package中的SignalHandler类注册自己的信号处理程序sun.misc,这样您就可以获得各种乐趣.

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

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



1> Joe Pineda..:

如果你想要的是明确地/程序化地杀死任何类型的另一个程序/进程,在SysInternals的pstools中有一个名为"pskill"的小工具,其行为就像Unixen"kill"一样.

如果你想要别的东西,继续阅读(虽然我可能在下面的一些细节上错了 - 自从我上次使用WinAPI和Charles Petzold的优秀书籍"Windows编程"作为指南,我上次开发了一个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向该窗口发送消息.



2> Mike Dimmick..:

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

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

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有