sd_bus_add_fallback()实例
时间: 2023-08-10 13:02:44 浏览: 128
下面是一个简单的使用 sd_bus_add_fallback() 的示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <systemd/sd-bus.h>
static int method_hello(sd_bus_message *msg, void *userdata, sd_bus_error *ret_error) {
const char *str = "Hello, World!";
sd_bus_message *reply = NULL;
int r;
r = sd_bus_message_new_method_return(msg, &reply);
if (r < 0) {
fprintf(stderr, "Failed to create reply message: %s\n", strerror(-r));
return r;
}
r = sd_bus_message_append(reply, "s", str);
if (r < 0) {
fprintf(stderr, "Failed to append string to reply message: %s\n", strerror(-r));
sd_bus_message_unref(reply);
return r;
}
return sd_bus_send(NULL, reply, NULL);
}
static int fallback_handler(sd_bus *bus, sd_bus_message *msg, void *userdata, sd_bus_error *ret_error) {
return method_hello(msg, userdata, ret_error);
}
int main(int argc, char *argv[]) {
sd_bus *bus = NULL;
int r;
r = sd_bus_open_system(&bus);
if (r < 0) {
fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
goto finish;
}
r = sd_bus_add_fallback(bus, "/org/example/TestObject", "org.example.TestInterface", "Hello", method_hello, NULL);
if (r < 0) {
fprintf(stderr, "Failed to add fallback handler: %s\n", strerror(-r));
goto finish;
}
/* Block until bus is closed */
r = sd_bus_wait(bus, (uint64_t)-1);
if (r < 0) {
fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r));
goto finish;
}
finish:
sd_bus_unref(bus);
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
```
这个示例代码创建了一个 D-Bus 的系统总线(system bus)连接,并在 `/org/example/TestObject` 对象上注册了一个名为 `Hello` 的方法,当该方法被调用时会返回字符串 `"Hello, World!"`。`sd_bus_add_fallback()` 函数将一个回调函数注册到指定的路径和接口,当该路径和接口上的方法被调用时,如果没有被匹配到具体的实现,就会调用该回调函数。在本例中,当 `Hello` 方法被调用时,因为没有其他具体的实现,所以会调用 `fallback_handler()` 函数,该函数实际上就是调用了 `method_hello()` 函数,构造并返回了一个包含字符串 `"Hello, World!"` 的消息。
阅读全文