ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-11-11 19:50:56  阅读:172  来源: 互联网

标签:dbus c-3 linux


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

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

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

解决方法:

tl; dr:

交货永远无法保证.但是,即使邮件未传递,您也可能会收到错误回复,这样说.

如果您使用DBUS_TIMEOUT_INFINITE,则可能永远等待回复.如果函数调用返回FALSE,将没有任何答复.否则,您将得到一个.

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

术语:调用dbus_connection_send_with_reply()的进程是客户端,应答复的进程是服务.通常在两者之间会有一个dbus守护程序,尽管在特殊情况下可以直接连接到服务(如果您正在执行此操作,那么您应该已经知道自己正在执行此操作).

通常,API保证是,如果dbus_connection_send_with_reply()成功(返回TRUE),您将看到准确的一个答复,这既可以是成功的返回(仅当消息已传递),也可以是错误的(无论消息是否发生)是否已交付).如果由于内存不足或其他病理状况而失败(返回FALSE),您将看不到任何答复.为了确保这一点,该实现花费了相当长的时间.

在dbus_connection_send_with_reply()返回之前,它会预先分配如果呼叫超时将收到的综合错误消息.如果失败,则不发送消息,并且dbus_connection_send_with_reply()失败.因此,即使dbus守护程序或传输将真正的(成功或错误)答复丢在了地板上,您最终也会收到超时错误消息. (参考:git grep _dbus_pending_call_set_timeout_error_unlocked在dbus源代码的副本中)

该API保证的一个例外是,如果您使用DBUS_TIMEOUT_INFINITE进行超时(在这种情况下:您要求它,则得到了).在这种情况下,在某些情况下您将永远看不到答复:服务永远不会响应,而是保持在总线上;或者或者,更糟糕的是,服务永远不会响应并离开总线,并且dbus-daemon会在尝试传递其综合的错误答复时耗尽内存,以报告该服务将永远不会答复.

标签:dbus,c-3,linux
来源: https://codeday.me/bug/20191111/2021938.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有