当前位置: 首页 > 面试题库 >

将信号发送到正在运行的JVM

东门秦迟
2023-03-14
问题内容

我正在使用自定义信号处理程序在自定义Java守护程序中捕获TERM,ABRT和INT信号。我在代码中有此处理程序,以便可以向其发送TERM信号,并通过kill命令正常关闭程序。信号处理程序现在可以正常工作,但是当我编译代码时,我收到以下警告(很多次):

警告:sun.misc.SignalHandler是Sun专有的API,将来的发行版中可能会删除它。

在使用这些类时:

import sun.misc.SignalHandler;
import sun.misc.Signal;

有没有更好的方法将信号发送到正在运行的JVM以启动主线程的关闭?我不希望将代码与该API绑定在一起,因为将来可能会删除它。

该代码现在可以使用1.5.0_22 JVM在Solaris和HPUX上运行。任何帮助或建议,将不胜感激。我使用了IBM的这份文档来开发信号处理程序:

http://www.ibm.com/developerworks/html" target="_blank">java/library/i-signalhandling/


问题答案:

首先,要了解这只是sun.misc软件包的标准警告。他们让您知道您使用的API不是标准的Java
API。这并不意味着他们将来会积极计划删除此API。http://java.sun.com/products/jdk/faq/faq-sun-
packages.html

就您的问题而言,我还不太清楚为什么Java进程处理终止信号的默认方式对您来说还不够:如何正常停止Java进程?。如果您需要添加其他逻辑,则可以添加关闭钩子。

尽管如此,如果您正在寻找其他方法来让Java进程知道该退出的时间,则可以让它在套接字,stdin或命名管道上侦听…

您可能还需要研究JVMTI



 类似资料:
  • 问题内容: 我有一个在我的应用程序中的单独线程中运行的类。我可以一次运行多个线程,并且这些线程是守护程序。一段时间后, 其中一些 线程需要接收和处理消息。我该怎么做呢? 我的代码示例如下所示: 输出: 但是,我希望最后五行与无关,而不是,我希望对我来说像这样: 我如何正确地向正在运行的线程发送这样的消息? 附录: 如果我在该块之后有这个块,并使用@dano的代码来解决上述问题,则它似乎没有响应这些

  • 问题内容: 我正在尝试在docker容器中运行用golang编写的服务器。例如: 如果我在本地计算机上运行此代码,则可以将其发送给with ,它将关闭应用程序。当我在docker容器中运行它时,我似乎无法使用杀死它。 然后,我继续使用docker向容器发送信号。 仍在运行… 仍在运行… 终于死了。 我没有在代码中捕获任何信号并忽略它们。我什至尝试增强上面的代码以捕获信号并将其打印出来(这在我的主机

  • 问题内容: 我有一个任务栏菜单,单击该任务栏菜单将其连接到获取触发事件的插槽。现在的问题是,我想知道单击了哪个菜单项,但是我不知道如何将该信息发送到连接的功能。这是用于将操作连接到功能的代码: 我知道有些事件会返回一个值,但是Trigger()不会。那么我该如何实现呢?我必须发出自己的信号吗? 问题答案: 用一个 这是PyQt书中的一个示例: 顺便说一句,您也可以使用,但是我发现该方法更加简单明了

  • 问题内容: Linux支持使用-Command 向进程发送任意Posix- Signal,例如或发送给进程。虽然并且以无聊或友好的方式结束流程的乏味老方法,是要触发核心转储。这可以用来触发正在运行的Java VM以打印出线程转储,包括所有正在运行的线程的堆栈跟踪-整齐!在打印调试信息之后,Java VM将继续执行以前的操作;实际上,线程转储仅发生在另一个具有最高优先级的派生线程中。(您可以使用自己

  • #include <stdio.h> #include <signal.h> void handler(int sig); void handler(int sig) { signal(sig, handler); printf("Receive signal: %d\n", sig); } int main(void) { signal(SI

  • 假设我在服务中有一个可用的字符串test=“value”,并希望将其发送到我正在运行的mainactivity。如何安全地发送数据?我在寻找一个最简单的例子,其他应用程序看不到数据。当我看意图时,它会说: 广播是任何应用程序都可以接收的消息。系统为系统事件提供各种广播,例如当系统启动或设备开始充电时。您可以将广播发送到 但是,我只想将其发送到我的应用程序,因为它包含私人数据。在我的服务中,我尝试了