gtk3 - 在g_application_hold()期间注销

时间:2017-07-04 21:02:20

标签: signals daemon gtk3 logout

我的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方式在守护进程模式下启动?

1 个答案:

答案 0 :(得分:0)

最后我知道这种奇怪行为的原因。它是由会话管理器触发的直接gtk_main_quit()引起的。

如果之前执行过一行g_application_release(..).,则不再有退出延迟。

实际上即使Gtk-CRITICAL也被gtk_main_quit()

触发了
Gtk-CRITICAL **: gtk_main_quit: assertion 'main_loops != NULL' failed

直到现在我才看到消息,因为会话管理器已经关闭了拥有的控制台。