gpt4 book ai didi

c - D-Bus 是否保证消息传递?

转载 作者:太空狗 更新时间:2023-10-29 11:07:27 25 4
gpt4 key购买 nike

我想知道当直接通过低级 C API 调用 dbus_connection_send_with_reply 使用时,D-Bus 是否保证消息传递?

更具体地说,它是否保证将消息的单个实例传递到目的地,或者如果失败则返回错误回复?

我了解接收应用程序可能不会对某个方法发出回复,在这种情况下,D-Bus 将在超时后返回错误。但是,D-Bus 协议(protocol)是否涵盖所有其他潜在故障?

最佳答案

tl;博士:

交货永远无法保证。但是,即使消息未送达,您也可能收到错误回复。

如果您使用 DBUS_TIMEOUT_INFINITE,您可能会永远等待回复。如果函数调用返回FALSE,则不会有回复。否则,您将得到一个。


我是 D-Bus(消息传递协议(protocol)规范)和 dbus(D-Bus 的引用实现)的上游维护者。

术语:调用dbus_connection_send_with_reply() 的进程是客户端,预期回复的进程是服务。通常在两者之间会有一个 dbus-daemon,尽管在​​特殊情况下直接连接到服务是可能的(如果你正在这样做,那么你应该已经知道你正在这样做)。

一般来说,API 保证是如果 dbus_connection_send_with_reply() 成功(返回 TRUE),您将看到一个回复​​,可以是成功返回(仅当消息已送达时)或错误(无论消息是否已送达都可能发生)。如果由于内存不足或其他异常情况(返回 FALSE)而失败,您将完全看不到回复。为了确保这一点,实现过程付出了相当大的努力。

dbus_connection_send_with_reply() 返回之前,它会预先分配如果调用超时您将收到的合成错误消息;如果失败,则不会发送消息并且 dbus_connection_send_with_reply() 失败。因此,即使 dbus-daemon 或传输器将真正的(成功或错误)回复丢弃在地板上,您最终还是会收到超时错误消息。 (引用:dbus 源代码副本中的 git grep _dbus_pending_call_set_timeout_error_unlocked)

该 API 保证的一个异常(exception)是,如果您使用 DBUS_TIMEOUT_INFINITE 作为超时(在这种情况下:您要求它,您得到它)。在那种情况下,有些情况下您将永远看不到回复:要么服务从不响应但仍然在总线上;要么或者,更病态地,服务从不响应并离开总线,并且 dbus-daemon 在尝试传递错误回复时内存不足来自服务的回复。

关于c - D-Bus 是否保证消息传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42158160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com