gpt4 book ai didi

Java 错误 : java. lang.IllegalArgumentException:信号已被 VM 使用:INT

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:04 35 4
gpt4 key购买 nike

我正在调查 Red Hat Linux 上的 Java 问题(使用 IBM JVM 1.4.2 64 位)。我想知道是否有人以前看到过此错误消息并且知道是否有解决此问题的方法?

来源:

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

public class SignalTest extends Thread
{
private static Signal signal = new Signal("INT");

private static ShutdownHandler handler = new ShutdownHandler();

private static class ShutdownHandler implements SignalHandler
{
public void handle(Signal sig)
{
}
}

public static void main(String[] args)
{
try
{
Signal.handle(signal, handler);
}
catch(Throwable e)
{
e.printStackTrace();
}

try { Thread.sleep(5000); } catch(Exception e) { e.printStackTrace(); }

System.exit(0);
}
}

输出:

java.lang.IllegalArgumentException <Signal already used by VM: INT>
java.lang.IllegalArgumentException: Signal already used by VM: INT
at
com.ibm.misc.SignalDispatcher.registerSignal(SignalDispatcher.java:145)
at sun.misc.Signal.handle(Signal.java:199)
at xxx

附加信息:

我发现了一些奇怪的事情。它失败的原因是因为我在 shell 脚本中将程序作为后台进程运行。

即信号测试.sh:

#!/bin/bash
java -cp . SignalTest >> sigtest.log 2>&1 &

如果我从命令行运行程序,或删除“&”(即使其成为 shell 脚本中的前台进程),它没有问题...我不明白为什么会这样。

最佳答案

这很可能是 JVM 实现的特定问题。我们正在使用未记录/不受支持的 API (sun.misc.Signal/SignalHandler),因此不保证 API 行为的契约(Contract)。

IBM JVM 实现可能会以不同于 SUN JVM 实现的方式执行与信号处理相关的事情,从而导致此问题。因此,此特定用例适用于 SUN JVM,但不适用于 IBM JVM。

但试试下面的方法(我自己无法尝试):

使用这些参数中的一个/两个/三个以及可能的值组合启动 JVM 后执行所有组合。

  1. 指定/未指定-Xrs选项
  2. 属性 ibm.signalhandling.sigint 设置为 true/false
  3. 属性 ibm.signalhandling.rs 设置为 true/false

(通过谷歌在几个错误转储中找到的属性,但我找不到关于它们的任何特定文档)

我不知道 IBM JVM 是否也支持这个特殊标志,但你也可以尝试添加这个,在 SUN JVM 中似乎是针对 linux/solaris 下信号处理程序的一些问题

-XX:-AllowUserSignalHandlers

或者尝试使用 native 信号处理程序(如果这是您的选择)。查看提供的代码示例:

虽然它与您的具体问题无关,但关于 JVM 信号处理的 IBM 文章(略有过时但仍然基本正确)。带有 native 代码信号处理程序的示例:

Revelations on Java signal handling and termination


但我想这可能都无济于事,因为 IBM JVM 实现可能依赖于处理 SIGINT 本身才能正常运行,因此永远不会给您处理 SIGINT 的机会> 你自己。

顺便说一句。来自 description to the -Xrs flag我明白这实际上可能会阻碍你做你想做的事。它说

When -Xrs is used on Sun's JVM, the signal masks for SIGINT, SIGTERM, SIGHUP, and SIGQUIT are not changed by the JVM, and signal handlers for these signals are not installed.

或者这可能意味着只有信号的 JVM 默认操作没有被执行。或者它可能取决于 JVM 实现的真正含义。

关于Java 错误 : java. lang.IllegalArgumentException:信号已被 VM 使用:INT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1050370/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com