Подтвердить что ты не робот

Захват SIGINT в Java

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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. Be предупредил, что пакеты com.sun.misc не поддерживаются и могут быть изменены или удалены в любое время и, вероятно, существуют только в Sun JVM.

Ответ 2

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

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

Ответ 3

Поскольку по крайней мере 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#BABHDABI (также доступно в копиях Windows и Solaris java).