Handling a signal using `jdk.unsupported/share/classes/sun/misc/SignalHandler.java` is failing since `22+b08`.
Looks like it was the change:
8308591: JLine as the default Console provider
JLine uses Signal.
Running with -Djdk.console=java.base does restore the old working signal behaviour.
### Reproduction
```
$ cat Jdk8346805_SignalHandlerJLineTest.java
import sun.misc.Signal;
public final class Jdk8346805_SignalHandlerJLineTest {
public static void main(String[] args) throws java.io.IOException {
Signal.handle(new Signal("INT"), signal -> System.out.format("[%s]", signal));
while (true) { if ("x".equals(System.console().readLine())) { break; } }
}
}
$ ~/oracle/jdk-22.0.2/bin/java Jdk8346805_SignalHandlerJLineTest.java
asd
foo
ff
[PRESSING CTRL+C AT THIS POINT]
Exception in thread "main" jdk.internal.org.jline.reader.UserInterruptException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:717)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.internal.le/jdk.internal.org.jline.JdkConsoleProviderImpl$JdkConsoleImpl.readLine(JdkConsoleProviderImpl.java:98)
at jdk.internal.le/jdk.internal.org.jline.JdkConsoleProviderImpl$JdkConsoleImpl.readLine(JdkConsoleProviderImpl.java:106)
at java.base/java.io.ProxyingConsole.readLine(ProxyingConsole.java:122)
at Jdk8346805_SignalHandlerJLineTest.main(Jdk8346805_SignalHandlerJLineTest.java:5)
$ ~/oracle/jdk-22.0.2/bin/java -Djdk.console=java.base Jdk8346805_SignalHandlerJLineTest.java
asd
foo
^C[SIGINT]
^C[SIGINT]
x
```
A command-line app that reads the terminal is likely to have found System.console() useful, and is also likely to be the kind of app that found this way of installing a SignalHandler to protect itself from accidental control-C killing the app.
Looks like it was the change:
8308591: JLine as the default Console provider
JLine uses Signal.
Running with -Djdk.console=java.base does restore the old working signal behaviour.
### Reproduction
```
$ cat Jdk8346805_SignalHandlerJLineTest.java
import sun.misc.Signal;
public final class Jdk8346805_SignalHandlerJLineTest {
public static void main(String[] args) throws java.io.IOException {
Signal.handle(new Signal("INT"), signal -> System.out.format("[%s]", signal));
while (true) { if ("x".equals(System.console().readLine())) { break; } }
}
}
$ ~/oracle/jdk-22.0.2/bin/java Jdk8346805_SignalHandlerJLineTest.java
asd
foo
ff
[PRESSING CTRL+C AT THIS POINT]
Exception in thread "main" jdk.internal.org.jline.reader.UserInterruptException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:717)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.internal.le/jdk.internal.org.jline.JdkConsoleProviderImpl$JdkConsoleImpl.readLine(JdkConsoleProviderImpl.java:98)
at jdk.internal.le/jdk.internal.org.jline.JdkConsoleProviderImpl$JdkConsoleImpl.readLine(JdkConsoleProviderImpl.java:106)
at java.base/java.io.ProxyingConsole.readLine(ProxyingConsole.java:122)
at Jdk8346805_SignalHandlerJLineTest.main(Jdk8346805_SignalHandlerJLineTest.java:5)
$ ~/oracle/jdk-22.0.2/bin/java -Djdk.console=java.base Jdk8346805_SignalHandlerJLineTest.java
asd
foo
^C[SIGINT]
^C[SIGINT]
x
```
A command-line app that reads the terminal is likely to have found System.console() useful, and is also likely to be the kind of app that found this way of installing a SignalHandler to protect itself from accidental control-C killing the app.
- relates to
-
JDK-8332921 Ctrl+C does not call shutdown hooks after JLine upgrade
-
- Resolved
-
-
JDK-8308591 JLine as the default Console provider
-
- Resolved
-