在DBus.properties中使用
GetAll
方法时,结果是
array [
dict entry(
string "Id"
variant string "cockpit.service"
)
dict entry(
string "Names"
variant array [
string "cockpit.service"
]
)
dict entry(
string "Following"
variant string ""
)
dict entry(
string "Requires"
variant array [
string "sysinit.target"
string "system.slice"
string "cockpit-wsinstance-http.socket"
string "cockpit-wsinstance-https-factory.socket"
string "cockpit-wsinstance-http-redirect.socket"
string "-.mount"
string "cockpit.socket"
]
)
.... ]
因此,我使用
sd_bus_message_enter_container(reply,'a',"{sv}")
输入第一个数组容器,并使用 (reply,'e',"sv")
输入第二个 sv 容器。然后,我想从这个容器中读取数据,但它们的数据类型不同。所以我无法读取像,read(reply,"s",&data)
(const char * data)
这样的数据,因为它可以是字符串,数组,字节数组......那么,我如何获取这些数据?
从容器获取数据的正确方法
最近的 systemd 版本具有
sd_bus_message_peek_type()
函数来确定下一个值的类型。 (请注意,GetAll 属性值始终为“variant”类型;它是您想要的变体内部的值。)
一般来说,给定的属性总是具有相同的类型。例如,如果您知道您刚刚读取了键名
Id
,那么您每次都会期待一个字符串值。