我能够使用dbus作为客户端,但如果我编译https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-server.c 在调用on_name_lost回调之后调用on_name_acquired回调。 我做的唯一更改是我使用G_BUS_TYPE_SYSTEM而不是G_BUS_TYPE_SESSION
我只是猜测这是一些身份验证问题。
答案 0 :(得分:0)
与会话总线不同,系统总线具有安全策略,可防止任意进程在总线上声明任意已知名称。您需要为系统总线安装configuration file以允许您的服务拥有一个名称:
a时检查具有
own
或own_prefix
属性的规则 连接尝试拥有一个众所周知的总线名称。作为一个特例,own="*"
匹配任何知名的公交车名称。着名的会话巴士 通常允许任何连接拥有任何名称,而众所周知 系统总线通常不允许任何连接拥有任何名称, 除非进一步配置允许。系统服务 将拥有一个名称必须安装允许他们这样做的配置, 通常通过<policy user="some-system-user"><allow own="…"/></policy>
形式的规则。
这意味着在/usr/share/dbus-1/system.d/org.mydomain.MyService1.conf
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- Only my-service-user can own the service -->
<policy user="my-service-user">
<allow own="org.mydomain.MyService1"/>
</policy>
<!-- Anyone can send messages to the service -->
<policy context="default">
<allow send_destination="org.mydomain.MyService1"/>
</policy>
</busconfig>
然后,您必须以my-service-user
用户身份运行服务流程。
D-Bus API design tutorial section on security policies是相关阅读。