D-Bus——注册system bus

2024-06-12 23:36
文章标签 注册 bus system

本文主要是介绍D-Bus——注册system bus,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 注册代码

在qt项目中创建无窗口项目:

#include <QCoreApplication>
#include <QDBusConnection>
#include <QDBusInterface>
#include <QDBusError>
#include <QDebug>class TestObject : public QObject
{Q_OBJECT
public:TestObject() {registerSystemDBus();}void registerSystemDBus() {QDBusConnection systemBus = QDBusConnection::systemBus();if (!systemBus.isConnected()) {qDebug() << "Failed to connect to system bus:" << systemBus.lastError().message();return;}if (!systemBus.registerService("com.example.TestSystemdService")) {qDebug() << "Failed to register service:" << systemBus.lastError().message();return;}if (!systemBus.registerObject("/com/example/TestObject",this,QDBusConnection::ExportAllSlots)) {qDebug() << "Failed to register object:" << systemBus.lastError().message();return;}}public slots:void testMethod() {qDebug() << "testMethod called";}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);TestObject testObject;return a.exec();
}#include "main.moc"
cmake_minimum_required(VERSION 3.14)project(systemd LANGUAGES CXX)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)
find_package(Qt5DBus)add_executable(systemdmain.cpp
)
target_link_libraries(systemd Qt${QT_VERSION_MAJOR}::Core Qt5::DBus)install(TARGETS systemdLIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

编译文件

cmake .. sudo make install

执行编译出的二进制文件,会报如下错误:

root@redflag:/etc/dbus-1/system.d# ./systemd Failed to register service: "Connection \":1.8\" is not allowed to own the service \"com.example.TestSystemdService\" due to security policies in the configuration file"

        这个错误消息表明当前 D-Bus 安全策略配置不允许应用程序注册服务 com.example.TestSystemdService。需要修改 D-Bus 的配置文件,以允许该服务的注册。

        以下是一个详细的步骤,确保正确配置 D-Bus 以允许注册服务:

        首先,创建一个新的 D-Bus 配置文件,例如 com.example.conf,并将其放置在 /etc/dbus-1/system.d/ 目录中:

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig><policy user="root"><allow own="com.example.TestSystemdService"/></policy>
</busconfig>

        这个配置文件允许 root 用户拥有服务 com.example.TestSystemdService。将上述内容保存为 /etc/dbus-1/system.d/com.example.conf。为了使新的配置文件生效,需要重启 D-Bus 守护进程:

sudo systemctl restart dbus

        确保配置文件 /etc/dbus-1/system.d/com.example.conf 的权限是正确的,使 D-Bus 守护进程能够读取该文件:

sudo chmod 644 /etc/dbus-1/system.d/com.example.conf
sudo chown root:root /etc/dbus-1/system.d/com.example.conf

        现在,再次运行你的程序,确保 D-Bus 服务可以成功注册。

        按照上述处理后,会报错

Error org.freedesktop.DBus.Error.ServiceUnknown: The name com.example.TestSystemdService was not provided by any .service files

        问题可能出在几个方面,尤其是服务文件的位置和权限。

        D-Bus 服务文件应该放在 /usr/share/dbus-1/system-services/ 目录下。确保文件名和内容正确,例如:

[D-Bus Service]
Name=com.example.TestSystemdService
Exec=/path/to/your/executable
User=root
注意这里的Exec 正常的家目录即可,不需要在root目录下,在root目录下会始终无法启动

        确保服务文件的权限和所有者正确:

sudo chmod 644 /usr/share/dbus-1/system-services/com.example.TestSystemdService.service
sudo chown root:root /usr/share/dbus-1/system-services/com.example.TestSystemdService.service

        确保你的可执行文件路径正确并且可执行:

        sudo chmod +x /path/to/your/executable

        重启 D-Bus 守护进程以确保新配置生效:

sudo systemctl restart dbus

        在放置了服务文件并重启 D-Bus 后,确保你的可执行文件正在运行中:

sudo /path/to/your/executable

        然后,在另一个终端中运行:

dbus-send --system --dest=com.example.TestSystemdService --print-reply /com/example/TestObject com.example.TestSystemdService.testMethod

        验证 D-Bus 服务是否已注册,可以使用以下命令:

busctl --system list | grep com.example.TestSystemdService

        如果问题依然存在,以下是一些调试步骤:

        查看 D-Bus 日志以获取更多调试信息:

sudo journalctl -u dbus

        在运行你的可执行文件后,确保它没有崩溃或退出。你可以在代码中添加调试信息来确认程序是否正常运行并注册了服务。

        确保服务文件的名称和路径与 D-Bus 配置一致,并且在服务文件中使用的 Exec 路径是正确的。

这篇关于D-Bus——注册system bus的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055655

相关文章

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Partical System

创建"粒子系统物体"(点击菜单GameObject -> Create Other -> Particle System) 添加"粒子系统组件"(点击Component -> Effects  ->Particle System) 粒子系统检视面板  点击粒子系统检视面板的右上角的"+"来增加新的模块。(Show All Modules:显示全部) 初始化模块: •

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

System.getProperties().

Java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

Chapter 13 普通组件的注册使用

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、组件创建二、局部注册三、全局注册 前言 在 Vue.js 中,组件是构建应用程序的基本单元。本章详细讲解了注册和使用 Vue 的普通组件的两种方式:局部注册和全局注册。 本篇文章参考黑马程序员 一、组件创建 ①定义 Vue 组件是一种具有特定功能的 Vue 实

c++11工厂子类实现自注册的两种方法

文章目录 一、产品类构建1. 猫基类与各品种猫子类2.狗基类与各品种狗子类 二、工厂类构建三、客户端使用switch-case实现调用不同工厂子类四、自注册方法一:公开注册函数显式注册五、自注册方法二:构造函数隐形注册总结 一、产品类构建 1. 猫基类与各品种猫子类 class Cat {public:virtual void Printer() = 0;};class

android6/7 system打包脚本

1.android5打包system就是网站上常见的制作ROM必备的解包打包system脚本 指令如下:mkuserimg.sh -s out/target/product/$TARGET_PRODUCT/system out/target/product/$TARGET_PRODUCT/obj/PACKAGING/systemimage_intermediates/system.img

android打包解包boot.img,system.img

原帖地址:http://www.52pojie.cn/thread-488025-1-1.html 转载Mark一下,日后研究 最近工作需要对boot.img,system.img进行破解。顺便将心得分享一下。 我的工作环境是在linux下的。所以工具都是针对linux的。 boot.img破解相关工具: 1、split_boot    perl脚本 2、boot_i

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二