C++ 应用程序在注销时不退出

C++ 应用程序在注销时不退出,c++,linux,qt,signals,C++,Linux,Qt,Signals,我想问一下,当用户注销时调用的信号是什么?我有一个QtGUI应用程序,它有SIGTERM和SIGHUP信号处理程序。该应用程序也有自己的关闭事件处理程序,因此用户无法通过单击X来关闭它。问题是,当用户注销时,ubuntu将图标挂在任务栏上,图标消失,但进程继续运行,并且不允许用户注销,因为它等待进程终止。当我使用kill-15'myapp'命令时,应用程序会按照预期正常关闭,因此问题不应该出现在我的处理程序中 static int setupHandlers(){ struct siga

我想问一下,当用户注销时调用的信号是什么?我有一个QtGUI应用程序,它有SIGTERM和SIGHUP信号处理程序。该应用程序也有自己的关闭事件处理程序,因此用户无法通过单击X来关闭它。问题是,当用户注销时,ubuntu将图标挂在任务栏上,图标消失,但进程继续运行,并且不允许用户注销,因为它等待进程终止。当我使用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只调用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();
    }