【问题标题】:What is a 'slot' in sd-bus (C language)什么是 sd-bus(C 语言)中的“插槽”
【发布时间】:2017-09-10 21:49:44
【问题描述】:

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,那么它就变成了一个“浮动槽”,我猜这意味着调用代码不需要担心它。

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

它需要一个插槽,然后稍后它会取消引用该插槽。但它实际上并没有做任何事情。

【问题讨论】:

  • “插槽”是硬件总线中的物理位置。插槽被编号(枚举),通常从 0 到连接器(插槽)的数量减去 1。您可以在插槽中放置广告板。
  • 这是一个针对sd-bussystemd 中的软件问题。我根本不是在谈论硬件。

标签: linux dbus systemd


【解决方案1】:

传递您自己的插槽会使您的 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

【讨论】:

  • 感谢您对这个问题给出如此清晰直接的回答。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2020-08-07
    相关资源
    最近更新 更多