Я хотел бы спросить, какой сигнал вызывается, когда пользователь выходит из системы? У меня есть приложение 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()
)
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).
Существует 3 стандартных оконечных сигнала, которые вы можете обрабатывать - SIGINT, SIGQUIT и SIGTERM. Попробуйте подписаться на каждый из них и посмотрите.
sigaddset(&hup.sa_mask, SIGHUP)