sd-bus中的'slot'是什么(C语言)

What is a 'slot' in sd-bus (C language)

systemd 的 sd-bus.h 文件中有几个 API,可以选择使用 slot 参数。下面是一些示例:

int sd_bus_call_async(sd_bus *bus, sd_bus_slot **slot, sd_bus_message *m, sd_bus_message_handler_t callback, void *userdata, uint64_t usec);
int sd_bus_add_filter(sd_bus *bus, sd_bus_slot **slot, sd_bus_message_handler_t callback, void *userdata);
int sd_bus_add_fallback(sd_bus *bus, sd_bus_slot **slot, const char *prefix, sd_bus_message_handler_t callback, void *userdata);

如果调用代码指定 NULL 那么它会变成 "floating slot",我想这意味着调用代码不需要担心它。

我看到的大部分示例源代码都像这个示例项目:https://github.com/tasleson/dbus-signals/blob/6d0e43d02d24ed51a17ce7df15a3a0a64ec0170d/spamsignals.c#L160

它占用一个插槽,然后在一段时间后取消引用该插槽。但它实际上并没有对它做任何事情。

传递您自己的插槽会使您的 sd-bus-match 生命与插槽之一纠缠在一起。这样,当您取消引用插槽时,您也会破坏匹配。
否则,传递 NULL 会将匹配的生命周期绑定到总线对象本身。
您列出的其他功能也是如此:
* sd_bus_call_async 带有槽让您可以选择通过取消引用槽来破坏异步调用。
*sd_bus_add_filter 带有槽会在取消引用槽时破坏过滤器。
我不确定 sd_bus_add_fallback 因为我从来没有听说过它。
在此处检查未引用插槽时调用的函数:https://github.com/systemd/systemd/blob/a7753693547233e4a1d6e10b1a8f6515a477f227/src/libsystemd/sd-bus/bus-slot.c#L68

Federico 是正确的,但也许更多细节会有所帮助?插槽本质上是一个不透明的句柄,它允许您管理附加到 sd_bus 句柄的对象(vtable、匹配规则、过滤器等)的生命周期。当您想添加一些东西然后再删除它时,这很有用。

如果您要添加的对象将在您的进程and/or sd_bus 句柄的整个生命周期内保留,那么您应该传递 NULL。