Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C D-Bus是否保证消息传递?_C_Linux_Dbus - Fatal编程技术网

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

C D-Bus是否保证消息传递?,c,linux,dbus,C,Linux,Dbus,我想知道当直接通过低级C API调用dbus\u connection\u send\u with_reply\code>使用时,D-Bus是否保证消息传递 更具体地说,它是否保证将消息的单个实例传递到目标,或者如果失败,则返回错误回复 我理解接收应用程序可能不会对方法发出回复,在这种情况下,D-Bus将在超时后返回错误。但是,D-Bus协议是否涵盖了所有其他潜在故障?这取决于底层传输层,但除非您让它在unix域套接字或TCP之外的其他设备上工作(如果您需要询问,则不需要),否则可以安全地假设您

我想知道当直接通过低级C API调用
dbus\u connection\u send\u with_reply\code>使用时,D-Bus是否保证消息传递

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


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

这取决于底层传输层,但除非您让它在unix域套接字或TCP之外的其他设备上工作(如果您需要询问,则不需要),否则可以安全地假设您将收到答复

资料来源:

tl;博士:

交货永远无法保证。但是,即使消息没有被传递,您也可以期待一个错误回复这样说

如果使用
DBUS\u TIMEOUT\u INFINITE
,您可能会永远等待回复。如果函数调用返回
FALSE
,则不会有响应。否则,您将只得到一个


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

术语:调用
dbus\u connection\u send\u with\u reply()
的进程是客户端,需要应答的进程是服务。通常在这两者之间会有一个
dbus守护进程
,尽管在特殊情况下可以直接连接到服务(如果您正在这样做,那么您应该已经知道您正在这样做)

通常,API保证,如果
dbus\u connection\u send\u with\u reply()
成功(返回
TRUE
),您将只看到一个回复,可以是成功返回(仅在消息已传递的情况下)或错误(无论消息是否已传递都可能发生)。如果由于内存不足或其他病理状况而失败(返回
FALSE
),您将完全看不到回复。为了确保这一点,实施过程付出了相当大的努力

dbus\u connection\u send\u with\u reply()
返回之前,它预先分配了调用超时时您将收到的合成错误消息;如果失败,则不会发送消息,
dbus\u connection\u send\u with\u reply()
失败。因此,即使
dbus守护进程
或传输将实际(成功或错误)回复丢弃在地板上,您最终也会收到超时错误消息。(参考:
git grep\u dbus\u pending\u call\u set\u timeout\u error\u unlocked
dbus
源代码的副本中)


API保证的一个例外是,如果您使用
DBUS\u TIMEOUT\u INFINITE
作为超时(在这种情况下:您请求超时,您得到了超时)。在这种情况下,有些情况下您将永远看不到回复:要么服务从未响应,但仍在总线上;或者,更病态的是,服务从不响应并离开总线,
dbus守护进程
在尝试传递错误回复时内存不足,而它合成了错误回复,以报告服务永远不会有回复。

值得指出的是,其他D-bus客户端库,具有类似的语义,即保证对已发送邮件只有一个响应(回复邮件或错误)。在您发布的链接中,“发件人或收件人断开连接/崩溃是另一种可能性。此外,如果存在阻止邮件的安全策略,则它将收到错误,而不是通过。”所以你可能得不到答复。