D-Bus保证信息传递?

D-Bus保证信息传递?

问题描述:

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

更具体地说,它是否保证消息的单个实例被传递到目的地,或者它是否失败返回错误应答?

我明白,接收应用程序可能不会发出一个方法的回复,在这种情况下,D-Bus将在超时后返回一个错误。但是,D-Bus协议涵盖了所有其他可能的故障吗?

TL;博士:

交货永远不能得到保证。但是,即使邮件未发送,您也可以期待错误回复。

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


我是D-Bus的上游维护者,消息传递协议规范和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或传输器丢失了真实(成功或错误)回复,您最终也会收到超时错误消息。 (参考:git grep _dbus_pending_call_set_timeout_error_unlockeddbus源代码的副本)

该API保证的一个例外是,如果您使用DBUS_TIMEOUT_INFINITE超时(在这种情况下:你问它,你明白了)。在这种情况下,有些情况你永远不会看到答复:服务从不响应,但仍然在公交车上;或者从病理学角度而言,该服务从不响应并离开公共汽车,并且dbus-daemon在试图传递其综合的错误答复时耗尽内存,以报告永远不会有来自该服务的答复。

+0

值得指出的是,像[GDBus](https://developer.gnome.org/gio/stable/gdbus-convenience.html)这样的其他D-Bus客户端库具有类似的保证一个响应的语义(回复消息或错误)发送到发送的消息。 –

这取决于底层的传输层,但是除非你使用unix域套接字或TCP以外的其他工具(如果你必须问,否则),否则可以安全地假设你会收到回复。

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