注销时应用程序不会退出

时间:2014-11-20 11:54:25

标签: c++ linux qt signals

我想问一下用户退出时调用的信号是什么?我有一个Qt gui应用程序,它具有SIGTERMSIGHUP信号的处理程序。该应用程序也有自己的关闭事件处理程序,因此用户无法通过单击“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()

2 个答案:

答案 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(杀死)。