Linux支持将任意Posix信号(如SIGINT或SIGTERM )发送到使用kill-Command的进程。虽然SIGINT和SIGTERM只是以友好或不友好的方式结束进程的无聊的老方法,但SIGQUIT是用来触发核心转储的。这可以用来触发运行中的Java来打印出线程转储,包括所有正在运行的线程的堆栈-整齐!打印调试信息之后,Java将继续执行它之前正在做的事情;实际上,线程转储只是在另一个优先级最高的派生线程中发生。(您可以通过使用kill -3 <VM-PID>自己来尝试。)
请注意,您还可以使用(不受支持的!) Signal和SignalHandler类在sun.misc-package中注册您自己的信号处理程序,这样您就可以享受各种乐趣。
但是,我还没有找到向Windows进程发送信号的方法。信号是由某些用户输入创建的:例如,Ctrl-C在两个平台上触发一个SIGINT。但是,在Windows上手动向运行中的进程发送信号似乎没有任何实用工具。显而易见的解决方案是使用Cygwin kill可执行文件,但是虽然它可以使用适当的Windows结束SIGBREAK进程,但我无法使用它发送一个SIGBREAK(相当于SIGQUIT);事实上,我认为它能够发送到Windows进程的唯一信号是SIGTERM。
因此,长话短说,重复标题:如何向Windows中的进程发送任意信号?
发布于 2008-09-26 15:58:44
如果您想要显式/以编程方式杀死任何类型的另一个程序/进程,那么在SysInternals的pstools中有一个名为"pskill“的小工具,它的行为就像Unixen的”杀死“一样。
如果你想要别的东西,继续读下去(尽管我在下面的一些细节上可能错了--自从我最后一次用C语言开发一个Windows程序以来,我一直只使用WinAPI和Charles的优秀书籍“为Windows编程”作为指南)。
在Windows上,没有正确的“信号”,WinMain和WinProc从操作系统接收的功能都是简单的消息。例如,当您单击窗口的"X“按钮时,Windows会向该窗口的处理程序发送消息WM_CLOSE。当窗口被删除但程序仍在运行时,它会发送WM_DESTROY。当它即将退出主消息处理循环时,WinMain (而不是WinProc)接收WM_QUIT。您的程序应该像预期的那样响应所有这些--您实际上可以开发一个“不可关闭”的应用程序,在接收到WM_CLOSE时不做它应该做的事情。
当用户从中选择任务并单击"End“时,操作系统将发送WM_CLOSE (以及另一个我不记得的任务)。但是,如果使用"End Process",则进程将直接终止,不会发送任何消息(源:旧的新事物)。
我记得有一种方法可以获得另一个进程窗口的HWND,一旦您得到该窗口,另一个进程就可以通过PostMessage和DispatchMessage函数发送消息。
发布于 2008-09-26 15:20:44
Windows不是POSIX。它没有信号。控制台程序获得的唯一“信号”是当它们调用SetConsoleCtrlHandler时,在这种情况下,可以通知用户用户已按下Ctrl+C、Ctrl+Break、关闭控制台窗口、注销或关闭系统。
其他一切都是用IPC完成的,通常是使用窗口消息或RPC。查看Sun的文档,看看是否有一种方法可以满足您在Windows上的要求。
发布于 2008-09-26 15:29:24
在Windows中,一切都围绕着Win32消息。我不认为有命令行工具可以这样做,但在C++中,您可以使用FindWindow向另一个Windows程序发送任意消息。例如:
#define WM_MYMSG ( WM_USER+0x100 )
HWND h = ::FindWindow(NULL,_T("Win32App"));
if (h) {
::PostMessage(h, WM_MYMSG, 0, 0);
}这也可以在C#中使用com互操作来完成。
https://stackoverflow.com/questions/140111
复制相似问题