C++ 应用程序在注销时不退出
我想问一下,当用户注销时调用的信号是什么?我有一个QtGUI应用程序,它有SIGTERM和SIGHUP信号处理程序。该应用程序也有自己的关闭事件处理程序,因此用户无法通过单击X来关闭它。问题是,当用户注销时,ubuntu将图标挂在任务栏上,图标消失,但进程继续运行,并且不允许用户注销,因为它等待进程终止。当我使用kill-15'myapp'命令时,应用程序会按照预期正常关闭,因此问题不应该出现在我的处理程序中C++ 应用程序在注销时不退出,c++,linux,qt,signals,C++,Linux,Qt,Signals,我想问一下,当用户注销时调用的信号是什么?我有一个QtGUI应用程序,它有SIGTERM和SIGHUP信号处理程序。该应用程序也有自己的关闭事件处理程序,因此用户无法通过单击X来关闭它。问题是,当用户注销时,ubuntu将图标挂在任务栏上,图标消失,但进程继续运行,并且不允许用户注销,因为它等待进程终止。当我使用kill-15'myapp'命令时,应用程序会按照预期正常关闭,因此问题不应该出现在我的处理程序中 static int setupHandlers(){ struct siga
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只调用exit0也尝试了exit0和abort有3个标准终止信号,您可以处理-SIGINT、SIGQUIT和SIGTERM。尝试订阅其中的每一个,然后查看 signalHandler只调用exit0,也尝试了exit0和abort 您需要告诉Qt退出。您的信号处理程序需要有对应用程序对象的引用,并调用QCoreApplication::exit0 无论是通过SIGTERM还是通过用户输入,您的应用程序都需要很好地处理终止请求。尤其要确保启动进程或线程的所有对象在发生时都被彻底销毁。经典代码的灵感来自:
执行此操作的代码需要停止,因此它首先很好地转发一个SIGTERM term terminate,等待一小段时间,然后用SIGKILL kill粗鲁地询问。噢,而且你忘了向set添加信号:sigaddset&hup.sa_mask,SIGHUPNothing更改,它仍然不允许我注销。
d->m_guiProcess.terminate();
if (!d->m_guiProcess.waitForFinished(1000)) { // This is blocking, so be fast.
d->m_guiProcess.kill();
d->m_guiProcess.waitForFinished();
}