GLib:在 Unix SIGINT 上优雅终止 GApplication

2 command-line glib sigint

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

我怎样才能克服这个问题并让 GApplication 正常关闭?

小智 5

您可以使用g_unix_signal_add()。一旦程序收到您指定的信号,该函数就会调用一个回调。(在本例中为 SIGINT)

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

(摘自参考手册:)

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

瓦拉的一个例子:

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 ();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果用户在应用程序关闭时再次按 Ctrl+C,则会发出严重警告。您应该从“on_sigint()”返回“GLib.SOURCE_REMOVE”,以在首次触发后删除信号处理程序,或者添加一些状态跟踪以避免调用“release()”次数多于“hold()”。 (2认同)