Захват SIGINT в Java

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

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

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

Регистрирует новый виджет остановки виртуальной машины.

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

  • Программа завершается нормально, когда последний stream не-daemon выходит или когда вызывается метод 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.

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

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

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

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

Примечание: это означает, что объект дампа streamа SIGQUIT отключен, когда -Xrs флаг -Xrs .

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

Interesting Posts

Сохранять изображения / видео в Hadoop HDFS

ASP.Net MVC Custom Model Binding пояснение

URLConnection FileNotFoundException для нестандартных источников HTTP-порта

Запуск приложения Facebook на localhost

Невозможно обработать проверку данных info.plist приложения в это время из-за общей ошибки (1095)

Как вырезать fragment

Как конвертировать файл Документов Google в Excel-файл (XLSX)

Поиск конкретных цветов пикселей BitmapImage

заменить специальные символы в строке в java

Как преобразовать String в Int?

Является ли размер std :: array определенным стандартом

Преобразование динамического диска в основной диск

# 1055 – Выражение списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец, это несовместимо с sql_mode = only_full_group_by

Autocompletetextview с пользовательским адаптером и фильтром

В Windows 7 вы можете перетащить окно с каждой стороны, чтобы разделить на 2 экрана, можете ли вы получить 4 с несколькими мониторами?

Давайте будем гением компьютера.