Приложение не закрывается при выходе

0

Я хотел бы спросить, какой сигнал вызывается, когда пользователь выходит из системы? У меня есть приложение Qt gui, которое имеет обработчик сигналов SIGTERM и SIGHUP. Приложение также имеет свой собственный обработчик событий, поэтому пользователь не может закрыть его, нажав "X". Проблема заключается в том, что когда пользователь выходит из системы, ubuntu зависает (значок из панели задач исчезает, но процесс продолжает работать) и не позволяет пользователю выйти из системы, потому что (imo) он ожидает завершения процесса. Когда я использую kill -15 'myapp' приложение закрывается нормально, так как предполагается, что проблема не должна быть в моем обработчике.

static int setupHandlers(){
    struct sigaction hup,term;

    hup.sa_handler = signalHandler;
    sigemptyset(&hup.sa_mask);
    hup.sa_flags = 0;

    if (sigaction(SIGHUP, &hup, 0) > 0){
       return 1;
    }

    term.sa_handler = signalHandler;
    sigemptyset(&term.sa_mask);

    if (sigaction(SIGTERM, &term, 0) > 0){
        return 2;
    }

    return 0;
}

signalHandler просто вызывает exit(0) (также пытался _exit(0) и abort())

Теги:
qt
signals

2 ответа

0

signalHandler просто вызывает exit (0) (также пытался _exit (0) и abort())

Вам скорее нужно сказать Qt для выхода. Ваш обработчик сигнала должен иметь ссылку на объект приложения и вызывать QCoreApplication::exit(0); ,

Независимо от того, является ли это SIGTERM или пользовательским вводом пользователя, ваше приложение должно хорошо обрабатывать запросы на завершение. В частности, убедитесь, что все объекты, запускающие процесс или поток, будут уничтожены, когда это произойдет. Классический код, вдохновленный QtCreator:

    d->m_guiProcess.terminate();
    if (!d->m_guiProcess.waitForFinished(1000)) { // This is blocking, so be fast.
        d->m_guiProcess.kill();
        d->m_guiProcess.waitForFinished();
    }

Код, выполняющий это, должен остановиться, поэтому он сначала хорошо SIGTERM (завершение), дожидайтесь небольшого количества времени и затем грубо попросите SIGKILL (kill).

0

Существует 3 стандартных оконечных сигнала, которые вы можете обрабатывать - SIGINT, SIGQUIT и SIGTERM. Попробуйте подписаться на каждый из них и посмотрите.

  • 0
    О, и вы забыли добавить сигналы для установки: sigaddset(&hup.sa_mask, SIGHUP)
  • 0
    Ничего не изменилось, это все равно не позволит мне выйти из системы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню