gdbus使用G_BUS_TYPE_SYSTEM做开机自启服务

我是用我自己在Glib学习(28) gdbus最简单的例子_gdbus 函数回调-CSDN博客中写的例程,运行服务端和客户端都没有问题,这里使用的bus type是G_BUS_TYPE_SESSION,会话模式。

当我把写好的程序配置成systemd自启动的服务时出现了问题。

name_lost_cb() Error: Failed to connect to dbus

在glib函数手册中已经明确写出了这种问题的原因

You are guaranteed that one of the name_acquired_handler and name_lost_handler callbacks will be invoked after calling this function - there are three possible cases:

  • name_lost_handler with a NULL connection (if a connection to the bus can't be made).

  • bus_acquired_handler then name_lost_handler (if the name can't be obtained)

  • bus_acquired_handler then name_acquired_handler (if the name was obtained).

大体意思就是如果无法连接到总线会执行name_lost_handler函数,如果链接到总线,但无法获取名称会执行bus_acquired_handler函数然后执行name_lost_handler函数,如果获得了名称会执行bus_acquired_handler然后name_acquired_handler函数。

上面的错误直接执行的name_lost_handler函数,说明没有链接到总线。

原因是dbus总线有两种

一个持久的系统总线(system bus):
它在引导时就会启动。这个总线由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序不能欺骗系统事件。它是桌面会话和操作系统的通信,这里操作系统一般而言包括内核和系统守护进程。这种通道的最常用的方面就是发送系统消息,比如:插入一个新的存储设备;有新的网络连接;等等。
还将有很多会话总线(session buses):
这些总线当用户登录后启动,属于那个用户私有。它是用户的应用程序用来通信的一个会话总线。同一个桌面会话中两个桌面应用程序的通信,可使得桌面会话作为整体集成在一起以解决进程生命周期的相关问题。这在GNOME和KDE桌面中大量使用。

ps -elf|grep dbus
4 S message+     747       1  0  80   0 -  2280 -      Nov27 ?        00:00:02 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
0 S renz      531384  450150  0  80   0 -  2109 ep_pol Nov28 ?        00:00:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
0 S wangyh   1373937 1372467  0  80   0 -  2074 -      08:13 ?        00:00:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only

上面就是系统中dbus总线的进程,--system 就是系统总线,--session就是会话总线。

我的理解是会话总线需要有会话才能创建对应的会话总线,然后程序才能连接到对应的会话总线上,因为每个会话有不同的会话总线。

所以系统systemd启动的肯定是没有会话总线存在的,或许有配置系统级别的会话总线的方式吧,我在网上没有找到。

所以我就把程序改成了使用系统总线G_BUS_TYPE_SYSTEM。

编译完成后,运行时出现了如下报错:

bus_acquired_cb()
name_lost_cb() Acquired bus name: cn.com.qwe

如上面glib提供的文档,说明现在找到总线了,但是没有成功分配名字。

然后我就开始在网上查找解决办法,但是资料很少,只有两篇问答有相关线索。

linux - sd-bus API,sd_bus_request_name 返回权限被拒绝 - IT工具网 (coder.work)

glib - DBus, failed to obtain systemwide name - Stack Overflow

glib - DBus,未能获得系统范围的名称 - IT工具网 (coder.work)

后两篇是一个,最下面的是第二篇的中文翻译。

这两篇文章中都提到了使用系统总线时需要提供配置文件,于是开始查找系统配置文件如何书写。

dbus-daemon

这是dbus的官方文档,文档中有对配置文件中各个元素的使用方法,有兴趣的可以自己阅读。

我是按照下面这个文章进行的配置。

dbus org.freedesktop.DBus.Error.AccessDenied 错误处理_acquire d-bus service gdbus.error:orgfreedesktop.d-CSDN博客

我是增加了一个.conf文件,和文章中不同的是,根据官方文档描述,这个conf文件应该放在/usr/share/dbus-1/system.d 目录下。

CONFIGURATION FILE
A message bus daemon has a configuration file that specializes it for a particular application. For example, one configuration file might set up the message bus to be a systemwide message bus, while another might set it up to be a per-user-login-session bus.The configuration file also establishes resource limits, security parameters, and so forth.The configuration file is not part of any interoperability specification and its backward compatibility is not guaranteed; this document is documentation, not specification.The standard systemwide and per-session message bus setups are configured in the files "/usr/share/dbus-1/system.conf" and "/usr/share/dbus-1/session.conf". These files normally <include> a system-local.conf or session-local.conf in /etc/dbus-1; you can put local overrides in those files to avoid modifying the primary configuration files.The standard system bus normally reads additional XML files from /usr/share/dbus-1/system.d. Third-party packages should install the default policies necessary for correct operation into that directory, which has been supported since dbus 1.10 (released in 2015).The standard system bus normally also reads XML files from /etc/dbus-1/system.d, which should be used by system administrators if they wish to override default policies.Third-party packages would historically install XML files into /etc/dbus-1/system.d, but this practice is now considered to be deprecated: that directory should be treated as reserved for the system administrator.

配置完成后就正常了

bus_acquired_cb()
name_acquired_cb() Acquired bus name: cn.com.qwe

是否连接成功也可以使用busctl命令查看

busctl
NAME                                   PID PROCESS         USER             CONNECTION    UNIT                      SESSION    DESCRIPTION
:1.0                                   372 avahi-daemon    avahi            :1.0          avahi-daemon.service      -          -
:1.1                                   374 connmand        root             :1.1          connman.service           -          -
:1.2                                   378 systemd-logind  root             :1.2          systemd-logind.service    -          -
:1.22                                  712 MCCS            root             :1.22         MCCS.service              -          -
:1.23                                  720 busctl          root             :1.23         session-c5.scope          c5         -
:1.3                                     1 systemd         root             :1.3          init.scope                -          -
:1.6                                   427 systemd         root             :1.6          user@0.service            -          -
cn.com.faw.mccs                        712 MCCS            root             :1.22         MCCS.service              -          -
fi.epitest.hostap.WPASupplicant          - -               -                (activatable) -                         -
fi.w1.wpa_supplicant1                    - -               -                (activatable) -                         -
net.connman                            374 connmand        root             :1.1          connman.service           -          -
org.freedesktop.Avahi                  372 avahi-daemon    avahi            :1.0          avahi-daemon.service      -          -
org.freedesktop.DBus                     1 systemd         root             -             init.scope                -          -
org.freedesktop.hostname1                - -               -                (activatable) -                         -
org.freedesktop.locale1                  - -               -                (activatable) -                         -
org.freedesktop.login1                 378 systemd-logind  root             :1.2          systemd-logind.service    -          -
org.freedesktop.network1                 - -               -                (activatable) -                         -
org.freedesktop.resolve1                 - -               -                (activatable) -                         -
org.freedesktop.systemd1                 1 systemd         root             :1.3          init.scope                -          -
org.freedesktop.timedate1                - -               -                (activatable) -                         -
org.freedesktop.timesync1                - -               -                (activatable) -                         -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝塔环境备份到西部数码FSS

1、登陆宝塔面板-软件商店-第三方应用&#xff0c; 搜索ftp&#xff1a;找到FTP存储空间&#xff0c;点击安装 2、在软件商城-已安装&#xff0c;找到ftp存储空间&#xff0c;点击进入选项设置. 3、按照下图填写fss相关参数.这些信息可以在fss详情中查看.目录路径如果没有请先在…

JConsole与jvisualvm都无法检测到本地的java程序的解决办法

直接在jar包启动时添加命令&#xff1a; 例如 start cmd /k "java -jar xxx.jar -XX:PerfBypassFileSystemCheck" .bat文件启动jar包命令后面添加-XX:PerfBypassFileSystemCheck 启动后&#xff0c;再打开JConsole或jvisualvm都会立马显示这个app

CSS伪类伪元素?:hover,::before,::after使用(举例)

文章目录 什么是CSS伪类&#xff1f;什么是伪元素&#xff1f;怎么用伪元素&#xff1f;可以做些什么&#xff1f;::before&#xff0c;在标签选择器之前添加内容&#xff0c;::after正好与之相反::before&#xff0c;在类选择器之前添加内容&#xff08;:制作一个悬浮提示窗 参…

Cesium中对Cesium.Cesium3DTileset模型进行偏移

Cesium中对Cesium.Cesium3DTileset模型进行偏移 3D Tiles 是将用于流式传输3D内容&#xff0c;包括建筑物&#xff0c;树木&#xff0c;点云&#xff0c;矢量数据。3DTiles 数据集以分块&#xff0c;分级渲染&#xff0c;将大数据量三维数据以分块&#xff0c;分层的形式组织起…

ROM和RAM概念

一、存储器特性 1&#xff09;易失性&#xff1a;掉电数据会丢失&#xff0c;通常指RAM&#xff1b; RAM分为SRAM、DRAM SRAM&#xff1a;静态RAM&#xff0c;只要上电数据就不会丢失&#xff1b; DRAM&#xff1a;动态RAM&#xff0c;需要每隔一段事件刷新数据&#xff0c;否…

宽量程双计数器测量方法

如要测量计数器信号的数字频率或周期&#xff0c;可使用双计数器方法测量宽量程信号。该方法适于待测量信号的范围较广且整个范围都需要较高测量精度的情况。关于使用宽量程测量方法提高测量精度的详细信息&#xff0c;见量化误差章节。也可使用该方法测量比计数器时基频率更高…

linux磁盘已满,查看哪个文件占用多

使用df -h查看磁盘空间占用情况 使用sudo du -s -h /* | sort -nr命令查看那个目录占用空间大 然后那个目录占用多 再通过sudo du -s -h /var/* | sort -nr 一层层排查&#xff0c;找到占用文件多的地方 如果通过以上方法没有找到问题所在&#xff0c;那么可以使用 lsof |…

python 实用函数——collections模块之Counter()

collections模块之Counter() Counter: 便捷快速计数&#xff08;支持所有存储结构&#xff09;,将元素计数&#xff0c;并返回一个字典&#xff0c;key为元素&#xff0c;value为该元素的数量&#xff0c;与count不同&#xff0c;count() 只会记录输入元素的数量 演示&#x…

UI自动化测试工具工作原理是怎样的?

随着软件开发的不断演进&#xff0c;保障软件质量成为了至关重要的一环。在这个过程中&#xff0c;UI自动化测试工具崭露头角&#xff0c;为开发团队提供了一种强有力的方式来确保应用程序的稳定性、功能性和兼容性。本文将深入探讨UI自动化测试工具的定义、工作原理以及其在提…

mybatis数据输入-零散的简单类型数据

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

版本控制系统Git学习笔记-Git基本知识介绍

目录 前言一、版本控制系统1.1 什么是版本控制系统1.2 本地版本控制系统1.3 集中化的版本控制系统1.3 分布式版本控制系统 二、Git简介2.1 数据处理方式2.2 几个特点2.2.1 几乎所有操作都是本地执行2.2.2 Git保证完整性2.2.3 Git一般只添加数据 2.3 Git中文件状态2.3.1 三种文件…

拼图游戏制作

2.创建用户界面 package domain; /** * ClassName: User * Author: Kox * Data: 2023/2/2 * Sketch: */ public class User { private String username; private String password; public User() { } public User(String username, String p…

防火墙之iptables

iptables概述 1.Linux 系统的防火墙 &#xff1a;IP信息包过滤系统&#xff0c;它实际上由两个组件netfilter 和 iptables组成。 2.主要工作在网络层&#xff0c;针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上。 -netfilter/iptables关系&#xff1a; netfil…

JS获取字符串里最长的回文字符串

方法一 使用双指针配合枚举 /*** param {string} s* return {string}*/ const longestPalindrome s > {const LEN s.lengthif (LEN < 2) {return s}let maxStr /*** param left * param right * returns */const findPalindrome (left, right) > {while (left &…

day32_Git

今日内容 零、 复习昨日 零、 复习昨日 一、引言 在单人开发过程中&#xff0c;需要进行版本管理&#xff0c;以利于开发进度的控制。 在多人开发过程中&#xff0c;不仅需要版本管理&#xff0c;还需要进行多人协同控制。 版本控制(VS) SVN GIT 二、介绍 Git是一个开源的…

rabbitmq-server-3.11.10.exe

rabbitmq需要erlang环境 otp_win64_25.1.exe erlang-CSDN博客 https://www.rabbitmq.com/download.htmlhttps://www.rabbitmq.com/install-windows.htmlhttps://github.com/rabbitmq/rabbitmq-server/releases/download/v3.11.10/rabbitmq-server-3.11.10.exe C:\Users\Admi…

Spine深入学习 —— 换装

Spine深入学习————换装 数据对象和实例对象的关系与区别 数据对象是无状态的&#xff0c;可在任意数量的骨架实例间共用。有对应实例数据的数据对象类名称以“Data”结尾&#xff0c;没有对应实例数据的数据对象则没有后缀&#xff0c;如附件、皮肤及动画。 实例对象有许…

python-GC机制、装饰器、生成器、迭代器、三元表达式、列表生成式、生成器表达式、函数递归、面向对象、

1 基础知识 1.1 GC机制 Python的垃圾回收&#xff0c;其实高级的语言都有自己的垃圾回收机制简称GC&#xff0c; python当中主要通过三种方式解决垃圾回收的方式&#xff0c;引用计数、标记清除、分代回收。引用计数&#xff1a;如果有新的引用指向对象&#xff0c;对象引用计…

产品运营常用的ChatGPT通用提示词模板

产品定位和规划&#xff1a;请帮助我明确产品的定位和规划&#xff0c;包括目标市场、用户需求、竞争对手等方面的内容&#xff0c;以便我能够更好地制定产品运营策略。 产品设计和开发&#xff1a;请帮助我进行产品设计和开发&#xff0c;包括功能设计、界面设计、用户体验等…

Nodejs 第二十章(fs 下)

概述 在 Node.js 中&#xff0c;fs 模块是文件系统模块&#xff08;File System module&#xff09;的缩写&#xff0c;它提供了与文件系统进行交互的各种功能。通过 fs 模块&#xff0c;你可以执行诸如读取文件、写入文件、更改文件权限、创建目录等操作&#xff0c;Node.js …