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

Man*_*d3r 5 c++ qt signals terminate

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

Man*_*d3r 5

Unix 信号处理程序允许调用的最小函数集。它们被称为异步信号安全函数。调用其他所有内容,包括每个 Qt 函数,都会导致未定义的行为。

仍然有一种方法可以在 Qt 中处理 unix 信号。该方法使用自管道技巧,并在 Qt 文档文章“从 Unix 信号处理程序调用 Qt 函数”中进行了描述

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