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

Does D-Bus guarantee message delivery?

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

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

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

这取决于底层传输层,但除非你让它在 unix 域套接字或 TCP 以外的东西上工作(如果你不得不问,你不会),可以安全地假设你会收到回复。

来源:
https://dbus.freedesktop.org/doc/dbus-tutorial.html#addresses
https://lists.freedesktop.org/archives/dbus/2007-June/008094.html

tl;博士:

交货永远无法保证。但是,即使邮件未送达,您也可以期待一个错误回复来说明这一点。

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


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

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

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

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

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