Обработка сигналов с использованием «TERM» - PullRequest
16 голосов
/ 11 сентября 2009

У меня есть отдельное приложение, в котором я должен предложить пользователю с диалоговым окном подтверждения сохранить изменения, сделанные им, когда он пытается выключить систему с помощью start-->shutdown.

Я узнал, что с помощью signalhandlers мы можем сделать это.
Может ли кто-нибудь помочь мне, как использовать обработчики сигналов

1 Ответ

37 голосов
/ 11 сентября 2009

Обновление май 2012 г. (через 2 с половиной года)

Трейказ комментарии:

В текущих версиях Java этот код обработки сигналов завершается сбоем, поскольку сигнал "INT" зарезервирован виртуальной машиной или операционной системой.
Кроме того, ни одно из других допустимых имен сигналов на самом деле не срабатывает, когда что-то требует закрытия приложения (я просто тщательно протестировал все те, о которых я мог узнать ...)
Хук завершения работы в основном работает, но мы обнаруживаем, что в нашем случае он не срабатывает, поэтому следующим шагом, очевидно, является обращение к регистрации обработчика за спиной JVM

В главе « Интеграция обработки сигналов и исключений » в « Руководстве по устранению неполадок для HotSpot VM » упоминаются только сигналы «SIGTERM, SIGINT, SIGHUP» для ОС Solaris и Linux.
Упоминается только обработка исключений в Windows.


Оригинальный ответ (сентябрь 2009 г.)

a ShutdownHook должен уметь обрабатывать этот случай

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    public void run() {
        // what you want to do
    }
}));

предостережениями )
Смотри также:

в качестве иллюстрации простой обработки сигналов:

public class Aaarggh {
  public static void main(String[] args) throws Exception {
    Signal.handle(new Signal("INT"), new SignalHandler () {
      public void handle(Signal sig) {
        System.out.println(
          "Aaarggh, a user is trying to interrupt me!!");
        System.out.println(
          "(throw garlic at user, say `shoo, go away')");
      }
    });
    for(int i=0; i<100; i++) {
      Thread.sleep(1000);
      System.out.print('.');
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...