检查 D-Bus 对象是否存在
Check if D-Bus object exists
我目前正在使用 GDBus 与 ConsoleKit 对话。我使用 ConsoleKit2 XML 文件和 gdbus-codegen
来生成代码。一切正常。但是如何检查一个对象是否存在呢?例如,我想看看是否有 /org/freedesktop/ConsoleKit/Session2
(只是一个例子,我知道我可以枚举 Seat 对象中的所有会话)。
我尝试使用 org.freedesktop.DBus.Peer.Ping
函数,但那样会 return
dbus-send --system --print-reply --reply-timeout=2000 --type=method_call --dest=org.freedesktop.DBus /org/freedesktop/ConsoleKit/Seat1 org.freedesktop.DBus.Peer.Ping
Error org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 1 matched rules; type="method_call", sender=":1.168" (uid=1000 pid=18279 comm="dbus-send --system --print-reply --reply-timeout=2") interface="org.freedesktop.DBus.Peer" member="Ping" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)
您有几个选项,按从最优选到最不优选的顺序列出:
- 使用
GetSessions()
枚举席位对象中的所有会话。
- 尝试在该会话的对象路径上调用您想要的方法,看看它是否失败并出现来自
org.freedesktop.DBus.Error
的错误。
- 在
/org/freedesktop/ConsoleKit
上调用 Introspect()
方法并从生成的 XML blob 中解析 <node>
元素以查看当前对象路径层次结构。
第一个选项可能是最容易实现的,也是您打算如何使用 ConsoleKit API。请注意,席位和会话编号不是确定性的,因此您不应该只是在代码中硬编码会话对象路径,因为该路径可能会在未来启动时发生变化。
另请注意,作为 ConsoleKit website says, ConsoleKit is deprecated in favour of systemd-logind,您应该考虑改用它。
我目前正在使用 GDBus 与 ConsoleKit 对话。我使用 ConsoleKit2 XML 文件和 gdbus-codegen
来生成代码。一切正常。但是如何检查一个对象是否存在呢?例如,我想看看是否有 /org/freedesktop/ConsoleKit/Session2
(只是一个例子,我知道我可以枚举 Seat 对象中的所有会话)。
我尝试使用 org.freedesktop.DBus.Peer.Ping
函数,但那样会 return
dbus-send --system --print-reply --reply-timeout=2000 --type=method_call --dest=org.freedesktop.DBus /org/freedesktop/ConsoleKit/Seat1 org.freedesktop.DBus.Peer.Ping
Error org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 1 matched rules; type="method_call", sender=":1.168" (uid=1000 pid=18279 comm="dbus-send --system --print-reply --reply-timeout=2") interface="org.freedesktop.DBus.Peer" member="Ping" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)
您有几个选项,按从最优选到最不优选的顺序列出:
- 使用
GetSessions()
枚举席位对象中的所有会话。 - 尝试在该会话的对象路径上调用您想要的方法,看看它是否失败并出现来自
org.freedesktop.DBus.Error
的错误。 - 在
/org/freedesktop/ConsoleKit
上调用Introspect()
方法并从生成的 XML blob 中解析<node>
元素以查看当前对象路径层次结构。
第一个选项可能是最容易实现的,也是您打算如何使用 ConsoleKit API。请注意,席位和会话编号不是确定性的,因此您不应该只是在代码中硬编码会话对象路径,因为该路径可能会在未来启动时发生变化。
另请注意,作为 ConsoleKit website says, ConsoleKit is deprecated in favour of systemd-logind,您应该考虑改用它。