Захват SIGINT в Java

Каков наилучший способ захвата сигнала уничтожения в Java без использования JNI. Я обнаружил sun.misc.Signal и sun.misc.SignalHandler и предупреждение о возможности удаления в будущих выпусках.

Будет ли использование JNI для вызова ac ​​lib единственным вариантом, который у меня есть?

3 ответа

Решение

Способ справиться с этим - зарегистрировать отключение. Если вы используете (SIGINT) kill -2 заставит программу грациозно завершить работу и запустить обработчики отключения.

Регистрирует новый хук отключения виртуальной машины.

Виртуальная машина Java отключается в ответ на два вида событий:

  • Программа завершается нормально, когда завершается последний поток, не являющийся демоном, или когда вызывается метод exit (эквивалентно System.exit), или

  • Виртуальная машина прерывается в ответ на пользовательское прерывание, такое как ввод ^C, или общесистемное событие, такое как выход пользователя из системы или завершение работы системы.

Я попробовал следующую тестовую программу на OSX 10.6.3 и на kill -9 это НЕ управляло отключением, не думал, что это будет. На kill -15 он запускает отключающий крюк каждый раз.

public class TestShutdownHook
{
    public static void main(final String[] args) throws InterruptedException
    {
        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                System.out.println("Shutdown hook ran!");
            }
        });

        while (true)
        {
            Thread.sleep(1000);
        }
    }
}

Это документированный способ написания ваших собственных обработчиков сигналов, которые не являются перехватчиками завершения работы в Java. Имейте в виду, что com.sun.misc пакеты и не поддерживаются и могут быть изменены или удалены в любое время и, вероятно, существуют только в Sun JVM.

Поскольку по крайней мере Java 6, HotSpot java команда имела -Xrs флаг, чтобы отключить обработчики сигналов JVM.

Если вы используете его, вам нужно реализовать свой собственный SIGINT, SIGTERM, SIGHUP, а также SIGQUIT обработчики, включая один для явного вызова System.exit(),

Примечание: это означает, что функция дампа потока SIGQUIT отключена, когда -Xrs флаг присутствует.

См. https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html (также доступно в Windows и Solaris java двойники).

Взгляните на Интегрирование обработки сигналов и исключений, описывающее способность JSM HotSpot делать цепочку сигналов. Это действительно вовлекает некоторую хитрость уровня C все же.

не было бы java.lang.Runtime.addShutdownHook(Thread) будет достаточно для вашей цели? Эти хуки запускаются JVM по окончании, включая прием SIGINTДо тех пор, пока JVM сможет их выполнять.

Другие вопросы по тегам