Ctrl + c убивает процесс, несмотря на обработку сигнала, работает на другом компьютере - PullRequest
0 голосов
/ 09 ноября 2018

Я запускаю приложение C ++ на xubuntu и реализовал обработчик сигнала, который обрабатывает SIGINT.Моя реализация должна быть в порядке, так как она работает на всех других машинах (той же ОС) - кроме моей.«Работа» означает, что сигнал принимается потоком обработчика сигналов и выполняется контролируемое отключение.

На моей машине ctrl + c просто убивает мое приложение.Никакой обработки, только «^ C» на консоли.

У кого-нибудь есть идея, почему это поведение зависит от машины?Могу ли я проверить какие-либо настройки?Спасибо.

РЕДАКТИРОВАТЬ: чтобы увидеть, связано ли это с поведением терминала ctrl + c, я попытался убить -2 PID вместо ctrl + c: такое же поведение, без обработки на моей машине, обработка, как ожидалось на других машинах.

Вот пример кода моего обработчика сигналов:

std::atomic_bool shutdown_requested;

void SignalHandler() {
  sigset_t signal_set;
  sigemptyset(&signal_set);
  sigaddset(&signal_set, SIGTERM);
  sigaddset(&signal_set, SIGINT);
  while (!shutdown_requested) {
    int sig = SIGUNUSED;
    sigwait(&signal_set, &sig);
    switch (sig) {
      case SIGINT:
      case SIGTERM:
        shutdown_requested = true;
        break;
    }
  }
}

void SetSignalHandler() {
  sigset_t signals;
  sigfillset(&signals);
  pthread_sigmask(SIG_SETMASK, &signals, nullptr);
  std::thread(SignalHandler);
}

Atomic shutdown_requested сигнализирует об отключении основного потока.Есть идеи?

1 Ответ

0 голосов
/ 09 ноября 2018

Я бы не обработал сигналы, порождающие новый поток, но я бы предпочел просто использовать signal() (см. «Сигнал man 2»).

Полагаю, что поскольку вы не устанавливаете новый обработчик сигнала с signal() (несмотря на его имя, ваш SignalHandler() не является обработчиком сигнала, это просто цикл выполнения потока), по умолчаниюостается активным.В некоторых системах ваш поток работает быстрее и корректно завершается, в других системах стандартный обработчик для SIGINT выигрывает, и ваше приложение уничтожается.

Возможно, другой подход заключался бы в отключении сигналов для процесса с sigprocmask(), но это был бы довольно странный подход к обработке сигналов.

Однако я предполагаю.Ваш пример не работает - В случае, если мое предположение неверно, я бы предложил подготовить MCVE , как рекомендовано в рекомендациях по стекопереработке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...