我的gtk3应用程序可以在GUI或守护进程模式下运行。为了实现守护进程模式,我使用g_application_hold()。
到目前为止,这种方法很有效,但是当我在守护程序模式下运行应用程序时从我的会话中退出时,我的系统会冻结8秒,直到操作系统杀死它。就像那样,我的干净关机程序没有执行。 这只发生在守护进程上,而不是在GUI模式下。
目前我通过挂钩SIGHUP信号解决了这个问题,该信号可用于实现会话注销:
static void
handle_hangup_signal (int signal)
{
MyApplication *application = my_application_get ();
g_application_release (G_APPLICATION (application));
}
...
signal(SIGHUP, handle_hangup_signal);
这解决了我的错误。没有8秒延迟,我的清理关闭被执行。
但是我想知道是否有更干净的gtk3解决方案?是否可以使用g_application_hold(),还是有一些更好的gtk3方式在守护进程模式下启动?
答案 0 :(得分:0)
最后我知道这种奇怪行为的原因。它是由会话管理器触发的直接gtk_main_quit()
引起的。
如果之前执行过一行g_application_release(..).
,则不再有退出延迟。
实际上即使Gtk-CRITICAL也被gtk_main_quit()
:
Gtk-CRITICAL **: gtk_main_quit: assertion 'main_loops != NULL' failed
直到现在我才看到消息,因为会话管理器已经关闭了拥有的控制台。