GLib:在Unix SIGINT上优雅地终止了GApplication

时间:2018-04-23 18:23:26

标签: command-line glib sigint

当用户在运行程序的Posix / Linux shell中命中 Ctrl + C 时,该程序会收到SIGINT信号。当运行基于GApplication的程序时,这意味着程序立即终止。

如何克服这个问题并让GApplication优雅地关闭?

1 个答案:

答案 0 :(得分:3)

您可以使用g_unix_signal_add()。此函数接受一个程序收到您指定的信号后调用的回调。 (在这种情况下为SIGINT)

然后该回调应调用g_application_release(),直到GApplication的使用计数降至零。一旦出现这种情况,主循环将终止,并且将发出GApplication的shutdown信号。通过处理该信号,您可以在程序终止之前执行所有必要的取消初始化任务。

(摘自reference manual :)

  

GApplication通过维护主应用程序实例的“使用计数”来提供方便的生命周期管理。可以使用g_application_hold()和g_application_release()更改使用计数。如果它降至零,则应用程序退出。 GtkApplication等高级类使用use count来确保应用程序保持活动状态,只要它有任何打开的窗口。

Vala中的一个例子:

public class MyApplication : Application {
    public MyApplication () {
        Object (flags: ApplicationFlags.FLAGS_NONE);

        startup.connect (on_startup);
        activate.connect (on_activate);
        shutdown.connect (on_shutdown);

        Unix.signal_add (
            Posix.SIGINT,
            on_sigint,
            Priority.DEFAULT
        );
    }

    private bool on_sigint () {
        release ();
        return Source.REMOVE;
    }

    private void on_startup () {
        print ("Startup\n");
    }

    private void on_activate () {
        print ("command line\n");
        hold ();
    }

    private void on_shutdown () {
        print ("Shutdown\n");
    }
}

void main (string[] args) {
    new MyApplication ().run ();
}

(使用valac foo.vala --pkg gio-2.0 --pkg posix编译)