在 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
那么它就变成了一个“ float 插槽”,我猜这意味着调用代码不需要担心它。
我看到的大部分示例源代码都像这个示例项目:https://github.com/tasleson/dbus-signals/blob/6d0e43d02d24ed51a17ce7df15a3a0a64ec0170d/spamsignals.c#L160
它占用一个插槽,然后在一段时间后取消引用该插槽。但它实际上并没有对它做任何事情。
最佳答案
传递您自己的插槽会使您的 sd-bus-match 生命与插槽之一纠缠在一起。这样,当您取消引用插槽时,您也会破坏匹配。
否则,传递 NULL 会将匹配的生命周期绑定(bind)到总线对象本身。
您列出的其他功能也是如此:
* 带有插槽的 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
关于linux - sd-bus中的 'slot'是什么(C语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43414858/