【发布时间】:2013-04-09 05:22:49
【问题描述】:
我在 linux 上工作,当我使用 Qt creator IDE 上的“停止”按钮关闭它时,我意识到我的应用程序正在留下守护进程。我想处理这些情况,以便应用程序以与关闭主窗口时相同的方式关闭。要编写处理程序,我需要知道它对应于哪些信号。
【问题讨论】:
-
我认为应该是 SIGTERM。
标签: linux qt signals qt-creator
我在 linux 上工作,当我使用 Qt creator IDE 上的“停止”按钮关闭它时,我意识到我的应用程序正在留下守护进程。我想处理这些情况,以便应用程序以与关闭主窗口时相同的方式关闭。要编写处理程序,我需要知道它对应于哪些信号。
【问题讨论】:
标签: linux qt signals qt-creator
深入研究 QtCreator 的代码,我可以看到 QtCreator 在内部使用 QProcess 来启动您的应用程序。红色的“停止”按钮连接到ApplicationLauncher::stop(),它会以两种方式之一终止您的进程,具体取决于它是 GUI 应用程序还是控制台应用程序,但在这两种情况下,Linux 上的结果最终都是相同的。
对于 GUI 应用程序,ApplicationLauncher 调用 QProcess::terminate(),后者又向您的守护程序发送 SIGTERM(在 Linux 上)信号。然后它等待(使用waitForFinished())1 秒,如果到那时守护程序还没有退出,它会调用QProcess::kill(),发送SIGKILL。
对于控制台应用程序,ApplicationLauncher 将终止委托给 ConsoleProcess 实用程序类。在 Linux 上,ConsoleProcess::stop() 的作用类似于 GUI 应用程序的 ApplicationLauncher,它首先发送 SIGTERM,然后等待 1 秒,如果尚未终止,则发送 SIGKILL。
您可以在此处找到来自 QtCreator 的相关代码:
【讨论】:
短版:你不能
长版:
您可以尝试使用:
http://doc.qt.digia.com/qt/qcoreapplication.html#aboutToQuit
但这不会按预期工作。如果一个进程被强制终止(这是 IDE 中的 stop 所做的,我猜想在 windows http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686714(v=vs.85).aspx 上使用 TerminateProcess() )然后该进程在它正在执行的任何中间被立即杀死。仅从 Qt 无法处理这些情况。
【讨论】: