通过 unix 信号优雅地终止 Qt 应用程序
Graceful termination of Qt application by unix signal
我在应用程序中保存设置时遇到问题。这是在相关对象的析构函数中完成的。它是一个启动器,通过关机终止是一个标准案例。应用程序实际保存设置的唯一方法是手动关闭它或会话关闭(至少在肉桂上,我想这只是关闭所有 windows)。即使 sudo reboot
也会阻止 Qt 应用程序展开堆栈上的对象。 killall -s <signal> <app>
终止对 SIGINT
、SIGKILL
和 SIGTERM
具有相同的效果。如何强制我的 qt 应用程序在 SIGTERM
正常终止? aboutToQuit 也没有发出。
有一组最小的函数允许 unix 信号处理程序调用。它们被称为 async-signal-safe 函数。调用其他一切,包括每个 Qt 函数,都会导致未定义的行为。
在 Qt 中仍然有一种处理 unix 信号的方法。该方法使用 self-pipe-trick 并在 Qt 文档文章 "Calling Qt Functions From Unix Signal Handlers" 中进行了描述。
基本上你打开一个管道,每当你收到一个信号你就::write(...)
(这是一个异步信号安全函数)到管道。在另一端,您使用 QSocketNotifier 收听管道。有关实现细节,请查看上面提到的 Qt 文章。
我在应用程序中保存设置时遇到问题。这是在相关对象的析构函数中完成的。它是一个启动器,通过关机终止是一个标准案例。应用程序实际保存设置的唯一方法是手动关闭它或会话关闭(至少在肉桂上,我想这只是关闭所有 windows)。即使 sudo reboot
也会阻止 Qt 应用程序展开堆栈上的对象。 killall -s <signal> <app>
终止对 SIGINT
、SIGKILL
和 SIGTERM
具有相同的效果。如何强制我的 qt 应用程序在 SIGTERM
正常终止? aboutToQuit 也没有发出。
有一组最小的函数允许 unix 信号处理程序调用。它们被称为 async-signal-safe 函数。调用其他一切,包括每个 Qt 函数,都会导致未定义的行为。
在 Qt 中仍然有一种处理 unix 信号的方法。该方法使用 self-pipe-trick 并在 Qt 文档文章 "Calling Qt Functions From Unix Signal Handlers" 中进行了描述。
基本上你打开一个管道,每当你收到一个信号你就::write(...)
(这是一个异步信号安全函数)到管道。在另一端,您使用 QSocketNotifier 收听管道。有关实现细节,请查看上面提到的 Qt 文章。