下面是一个简单的示例,演示如何使用GDBus进行进程间通信:
#include <gio/gio.h>
void on_bus_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data)
{
GError *error = NULL;
guint registration_id;
// 创建代理对象
GDBusProxy *proxy = g_dbus_proxy_new_sync(connection,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"org.example.ExampleService",
"/org/example/ExampleObject",
"org.example.ExampleInterface",
NULL,
&error);
if (error != NULL) {
g_printerr("Failed to create proxy: %s\n", error->message);
g_error_free(error);
return;
}
// 调用远程方法
GVariant *result = g_dbus_proxy_call_sync(proxy,
"SayHello",
g_variant_new("(s)", "World"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
if (error != NULL) {
g_printerr("Failed to call remote method: %s\n", error->message);
g_error_free(error);
return;
}
// 解析返回值
gchar *response;
g_variant_get(result, "(s)", &response);
// 打印返回结果
g_print("Received response: %s\n", response);
// 释放资源
g_variant_unref(result);
}
int main(int argc, char **argv)
{
GMainLoop *loop;
// 初始化GLib库和GIO模块
g_type_init();
// 创建D-Bus连接
GDBusConnection *connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
if (connection == NULL) {
g_printerr("Failed to get D-Bus connection.\n");
return 1;
}
// 获取总线名
gchar *bus_name = g_strdup_printf("org.example.ExampleClient-%d", getpid());
// 请求总线名
guint owner_id = g_bus_own_name(G_BUS_TYPE_SESSION,
bus_name,
G_BUS_NAME_OWNER_FLAGS_NONE,
on_bus_acquired,
NULL,
NULL,
NULL,
NULL);
// 进入主事件循环
loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
// 释放资源
g_bus_unown_name(owner_id);
g_object_unref(connection);
g_free(bus_name);
return 0;
}
请注意,此示例假设你已经在D-Bus上运行了一个服务(org.example.ExampleService
),该服务在对象路径 /org/example/ExampleObject
上提供了一个接口(org.example.ExampleInterface
),并具有一个 SayHello
方法。你需要相应地修改代码以适应你自己的实际情况。
此外,编译时需要链接GIO库,使用命令:
gcc -o example example.c `pkg-config --cflags --libs gio-2.0`
希望这个示例能帮到你!
内容由零声教学AI助手提供,问题来源于学员提问