dbus

回调函数、同步、异步、阻塞、非阻塞、D-BUS等概念的理解

强颜欢笑 提交于 2019-12-06 08:08:12
同步、异步与阻塞、非阻塞 这个几个概念很容易被混淆。这些概念基本都是使用在多个部件进行协作或需要在一定时间内完成的场景中。 首先,将这几个概念的定义和应用场景分析一下: 同步、异步 同步 同步的概念是应用在线程上,线程之间的同步是指两个或多个线程对同一个资源的协调使用。 那么什么是同步函数哪? 仍然与线程和资源有关。这里的资源,可以看做线程的操作任务。通常,此时同步函数内有对资源的同步操作,如mutex等。 当一个线程调用一个同步函数时(例如:该函数用于完成写文件任务),如果该函数没有立即完成规定的操作,则该操作会导致该调用线程的挂起(将CPU的使用权交给系统,让系统分配给其他线程使用),直到该同步函数规定的操作完成才返回,最终才能导致该调用线程被重新调度。 异步 而异步函数,则是即使函数中的操作没有完成,没有结果返回,主线程也不会被阻塞。 而函数的任务则可能由其他线程或子线程来完成。完成后,再通知调用主线程,主线程内应该有相应的机制等待或响应处理结果(这里又是一个主线程对函数结果进行等待处理的过程)。 而当调用结果出来时,通知主线程的方式,即异步调用的实现方式有哪些? 回调函数(register, response)、event(windows)、消息(windows) 阻塞、非阻塞 不同的背景知识,对这些概念的使用范围也不同,这里特指网络IO的阻塞、非阻塞。另外多路IO,

DBus应用的俩种形态及实现

删除回忆录丶 提交于 2019-12-06 08:06:45
介绍一下基于DBus设计的应用程序的俩种形态及如何使用GDbus来实现。 基于DBus的应用程序可以是使用DBus Daemon的总线型结构,每个DBus的请求通过DBus Daemon转发;或者是点对点的星型结构,Client与Server之间是直接的Peer2Peer的连接。这俩种结构各有优缺点:总线型的结构比较清晰,Server需要维护的连接较少,实际上只有一个与DBus Daemon相连的连接,广播消息可以很容易的发送到各个Client;P2P形式的DBus通信中间因为少了DBus Daemon的中转,因此性能更好,大约提升30%。 基于GLib提供的GBus实现基于以上俩种形态的DBus应用还是非常简单的: 1. 准备工作 1.1 提供一个用于代码生成的XML文件 这份XML数据在GDBus中称为introspection data,用来描述提供服务的GObject的接口名与参数。用于gdbus-codegen可以使用这份XML文件生成在Client与Server侧使用的代码。对于总线型DBus应用和P2P型DBus应用,这份代码是通用的。 1.2 编译生成的代码 生成的代码需要分别链接到俩个进程中:带有Skeleton字样的代码,运行在Server侧;带有Proxy字样的代码,运行在Client侧。 2. 总线型 2.1 Server 2.1.1

dbus的hello world

心已入冬 提交于 2019-12-06 08:06:29
来自: http://blog.csdn.net/chenyufei1013/article/details/6573411 dbus的是一个低延迟,低开销,高可用性的IPC机制。通过dbus的daemon,可以实现进程间通信和函数调用。Windows下,dbus的开发库可以去这里( http://code.google.com/p/dbus-windows-installer/downloads/list )下载,在VS设置头文件和lib库的路径即可。若是要编写其Hello World,自然包含客户端和服务端两部分。下面的Hello World代码包含了发送消息和函数调用两部分,分别描述之。 1) 信号 假设客户端发送消息,服务端接收。客户端发送消息的流程如下: 1.创建于dbus daemon的会话连接。 2.创建消息,若有消息参数,附加之(这个一般都有) 3.通过连接发送消息。 1: int main ( int argc, char *argv[]) 2: { 3: DBusError dberr; 4: DBusConnection *dbconn; 5: DBusMessage *dbmsg; 6: char *text; 7: 8: // 初始话错误信息的结构体 9: dbus_error_init (&dberr); 10: 11: // 创建会话连接 12:

Windows下,dbus的hello world

自作多情 提交于 2019-12-06 08:06:08
dbus的是一个低延迟,低开销,高可用性的IPC机制。通过dbus的daemon,可以实现进程间通信和函数调用。Windows下,dbus的开发库可以去这里( http://code.google.com/p/dbus-windows-installer/downloads/list )下载,在VS设置头文件和lib库的路径即可。若是要编写其Hello World,自然包含客户端和服务端两部分。下面的Hello World代码包含了发送消息和函数调用两部分,分别描述之。 1) 信号 假设客户端发送消息,服务端接收。客户端发送消息的流程如下: 1.创建于dbus daemon的会话连接。 2.创建消息,若有消息参数,附加之(这个一般都有) 3.通过连接发送消息。 1: int main ( int argc, char *argv[]) 2: { 3: DBusError dberr; 4: DBusConnection *dbconn; 5: DBusMessage *dbmsg; 6: char *text; 7: 8: // 初始话错误信息的结构体 9: dbus_error_init (&dberr); 10: 11: // 创建会话连接 12: dbconn = dbus_bus_get (DBUS_BUS_SESSION, &dberr); 13: if (dbus

DBus支持

一曲冷凌霜 提交于 2019-12-06 08:03:32
DBus支持 PyQt5提供了两个不同的模块来实现对DBus的支持。所述 QtDBus 模块提供用于标准的Qt的DBus类包装。dbus.mainloop.pyqt5模块将Qt事件循环的支持添加到标准 dbus-python Python模块。 QtDBus 所述 QtDBus 模块以类似的方式,以它包装C ++库使用。主要区别在于它支持DBus结构的解组。C ++依赖于基于模板的类型注册,使用 qDBusRegisterMetaType() Python无法实现。相反,在参数中接受DBus结构的插槽应指定具有单个 QDBusMessage 参数的插槽。然后,槽的实现应该使用其 arguments() 方法从消息中提取参数 。 例如,假设我们有一个名为DBus的方法 setColors() ,它有一个参数,它是一个由三个整数(红色,绿色和蓝色)组成的结构数组。然后,参数的DBus签名将是 a(iii) 。在C ++中,您通常会定义一个类来保存红色,绿色和蓝色值,因此您的代码将包含以下(不完整)片段: struct Color { int red; int green; int blue; }; Q_DECLARE_METATYPE(Color) qDBusRegisterMetaType<Color>(); class ServerAdaptor : public

dbus的Embedded移植

亡梦爱人 提交于 2019-12-06 07:57:32
一、所需下载安装安装包: 1 、 dbus-1.8.0.tar.gz http://www.freedesktop.org/wiki/Software/dbus 2 、 expat-2.1.0.tar.gz http://sourceforge.net/projects/expat/ 二、安装步骤 1 、 expat 安装 tar -zxvf expat-2.1.0.tar.gz cd expat-2.1.0/ 先进行配置: ./configure --host=arm-none-linux-gnueabi( 编译器) --prefix=/home/yjs/expat( 安装目录 ) 编译源文件: make. 安装: make install. 2 、 dbus 安装 tar -zxvf dbus-1.8.0.tar.gz cd dbus-1.8.0.tar.gz 配置: ./configure --prefix=/home/yjs/dbus( 安装目录 ) --host=arm-none-linux-gnueabi “LIBS=-L/home/yjs/expat/lib”( 刚才引用安装的 expat 的库文件 ) “CPPFLAGS=-I/home/yjs/expat/include”( 引用 expat 的头文件 ) 编译源文件: make 安装: make install

阿里云ECS服务器CentOS6.5vnc连接时报错Failed to connect to socket /tmp/dbus-xxxxxxx: Connection refused

蹲街弑〆低调 提交于 2019-12-06 07:56:54
问题: 通过tightvnc远程连接阿里云服务器CentOS6.5,一直都可以正常连接,突然开始报错: Failed to connect to socket /tmp/dbus-xxxxxxx: Connection refused 注意: 以下命令都是以root执行的(不好意思,这不是好的做法),如果以其他用户执行某命令遇到没有管理员权限问题,可以给该用户设置sudo权限,同时该命令前加sudo (sudo加一个空格) 排查: 搜了一堆文章,改来改去,这种情况依然存在,包括但不限于: 卸载重装所有图形界面模块 卸载重装dbus 重启messagebus 重启haldaemon 重启vncserver 由于修改太多太混乱,一度导致ECS服务器网卡异常,彻底断网,无法从公网连接,也无法连接公网,ping公网ip和内网ip全都失败,只能在网页控制台登录,此时登录后直接是Gnome图形界面。 无奈只好提交工单请阿里工程师处理,工程师快速处理之后,网的问题解决了,十分感激,但是控制台登录时,已经不再是图形界面,而是只有文字界面,dbus的问题还是存在 vim ~/.vnc/<机器名>:1.log 里面有关的报错行类似如下: (拷贝自 https://superuser.com/questions/259943/vnc-error-could-not-connect-to-session

dbus/qt检测U盘:Failed to connect to socket。。。 system_bus_socket: Connection refused解决

◇◆丶佛笑我妖孽 提交于 2019-12-06 07:56:44
经过今天研究,终于明白了dbus移植到arm后,使用流程。 往往第一次运行程序的时候会出现这个问题, "?????????QDBusInterface?" "Failed to connect to socket /usr/local/arm/dbus-1.0. 2/var/run/dbus/system_bus_socket: Connection refused" 原因是dbus没有启用。 解决:cd /usr/local/arm/dbus-1.0.2/bin/,运行: [root@FriendlyARM bin]# ./dbus-daemon --system Failed to start message bus: The pid file "/usr/local/arm/dbus-1.0.2/var/run/mes sagebus.pid" exists, if the message bus is not running, remove this file 切换到messagebus.pid所在的目录,rm删除它。再返回到dbus的bin运行 ./dbus-daemon --system这次便正常运行了! (注意这里我昨天已经运行adduser命令了!请参照我昨天文章。) 再次切换到我的应用程序目录,运行后依然提示: "?????????QDBusInterface?"

centos7 docker容器报 docker Failed to get D-Bus connection 错误

混江龙づ霸主 提交于 2019-12-06 07:54:19
在centos7的docker容器里面 不能用service启动服务。 systemctl start httpd 报错内容: Failed to get D-Bus connection: Operation not permitted。 网上查询资料,说在docker run容器的时候加上 --privileged 参数,然而并无卵用。 报这个错的 原因是dbus-daemon没能启动。systemctl并不是不能使用。将CMD或者entrypoint设置为/usr/sbin/init即可。docker容器会自动将dbus等服务启动起来。如下: docker run --privileged -ti --name test docker.io/centos:7 /usr/sbin/init 来源: CSDN 作者: Younge__ 链接: https://blog.csdn.net/yongaini10/article/details/70183077

linux Failed to connect to socket /var/run/dbus/system_bus_socket: No such file

我与影子孤独终老i 提交于 2019-12-06 07:52:59
在执行service cron status的时候,可能会发现这样的错误: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory 解决方法时安装系统间用来进行消息传递的dbus: 1、sudo apt-get install dbus 2、启动dbus: sudo /etc/init.d/dbus start, ubantu会提示使用service dbus start来进行启动,于是使用 service dbus start来启动即可。 然后再运行service cron start,service cron status即可正确执行。 来源: CSDN 作者: iteye_4921 链接: https://blog.csdn.net/iteye_4921/article/details/82637802