我想问一下用户退出时调用的信号是什么?我有一个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()
)
答案 0 :(得分:0)
您可以处理3种标准终止信号 - SIGINT,SIGQUIT和SIGTERM。尝试订阅每一个并查看。
答案 1 :(得分: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
(杀死)。