通过unix信号优雅地终止Qt应用程序

时间:2015-10-12 13:56:07

标签: c++ qt signals terminate

我在保存应用程序中的设置时遇到问题。这是在相关对象的析构函数中完成的。它是一个发射器,关机终止是标准情况。应用程序实际保存设置的唯一方法是手动关闭它或会话关闭(至少在肉桂上,我想这只是关闭所有窗口)。即使sudo reboot也阻止Qt应用程序展开堆栈上的对象。按killall -s <signal> <app>终止对SIGINTSIGKILLSIGTERM具有相同的效果。如何强制我的qt应用程序优雅地终止于SIGTERMaboutToQuit也不会被发出。

1 个答案:

答案 0 :(得分:2)

不幸的是,互联网传播了许多错误的信息,这些信息导致了未定义的行为。允许unix信号处理程序调用一组最小的函数。它们被称为 async-signal-safe 函数。调用其他所有内容,包括每个Qt函数,都会导致未定义的生成。还有一种方法可以在Qt中处理unix信号。该方法使用 self-pipe-trick ,并在Qt文档文章"Calling Qt Functions From Unix Signal Handlers"中进行了描述。

基本上你打开一个管道,每当你收到信号时,你::write(...)(这是一个异步信号安全功能)到管道。在另一端,您使用QSocketNotifier收听管道。有关实现细节,请查看上面提到的Qt文章。