signals - gtk3 - 在 g_application_hold() 期间注销

标签 signals daemon gtk3 logout

我的 gtk3 应用程序可以在 GUI 中运行,也可以在守护程序模式下运行。为了实现守护进程模式,我使用g_application_hold() .

到目前为止,这效果很好,但是一旦我在守护程序模式下运行应用程序时从 session 中注销,我的系统就会卡住 8 秒,直到操作系统杀死它。这样我的干净关闭程序就没有执行。 这仅发生在守护进程中,而不是在 GUI 模式下。

目前我通过hook SIGHUP信号解决了这个问题,可以用来实现 session 注销:

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 方法在守护进程模式下启动某些东西?

最佳答案

我终于知道这种奇怪行为的原因了。这是由直接 gtk_main_quit() 引起的,由 session 管理器触发。

如果 g_application_release(..).前一行执行,不再有注销延迟。

实际上,甚至 Gtk-CRITICAL 也被此触发了 gtk_main_quit() :

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

到目前为止,我还没有看到该消息,因为 session 管理器已经关闭了所属控制台。

关于signals - gtk3 - 在 g_application_hold() 期间注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44913967/

相关文章:

Python-daemon 不会杀死它的 child

java - 将 "daemon"-status 传播到 Java 中的所有子线程

c++ - 将 C++ 用于网络守护进程有什么缺点吗?

c - Gtk 在单击按钮时更改多个标签

c - c 中的 shell : only respond to SIGTSTP after pressing enter on keyboard

linux - SIG_DFL 到底做了什么?

c - 信号处理程序是在内核空间还是用户空间运行?

C 程序可以在处理信号后继续执行吗?

css - 使用 CSS 更改 GtkTextView (GTK 3.22) 的背景颜色

python - 如何在 Gtk 中制作类似 Lollypop 的侧边栏?