dbus - hualet/upsteam-knowledges GitHub Wiki
说明
这里说得 dbus 服务并不是 dbus-daemon,而是一个通过 dbus 注册的服务,例如 org.freedesktop.Notifications.service。
dbus服务激活
通过 service 文件激活 dbus 服务的代码位于 bus/activation.c 中的 bus_activation_activate_service 函数;
service 文件查找
一个 service 文件对应于一个 struct BusActivationEntry 类型,通过服务名查找 service 文件的函数是 activation_find_entry。dbus-daemon 内部维护了一个 struct BusActivationEntry 类型的哈希表,activation_find_entry函数会先从中查找特定的服务名,如果哈希表为空,则重新获取、更新哈希表。
更新哈希表的动作由 update_service_cache 完成,这个函数会从所有支持的 service 文件存放目录(比如 /usr/share/dbus-1/services)获取所有 service 文件,并将每个 service 文件解析成 struct BusActivationEntry,并且存入哈希表中。
每个目录的遍历在 update_directory 函数中实现,其中可以看到加入两个文件声明的同样的服务,那么谁先被执行是不确定的,依赖于文件读出的先后顺序,也就是 readdir 函数返回文件列表的顺序。