Linux进程间通信总结

进程间通信的基础方式 

先看篇文章大概熟悉下进程间通信的几种方式:

【万字详解Linux系列】进程间通信(IPC)-CSDN博客

一些进程间通信框架

有一些进程间通信可以使用的框架,本质上也是基于基本的进程间通信。

UBUS

参考:[openwrt] 使用ubus实现进程通信 - LiuYanYGZ - 博客园 (cnblogs.com)

ubus为openwrt平台开发中的进程间通信提供了一个通用的框架。它让进程间通信的实现变得非常简单,并且ubus具有很强的可移植性,可以很方便的移植到其他linux平台上使用。

ubus实现的基础是unix socket,即本地socket,它相对于用于网络通信的inet socket更高效,更具可靠性。unix socket客户端和服务器的实现方式和网络socket类似,读者如果还不太熟悉可查阅相关资料。

我们知道实现一个简单的unix socket服务器和客户端需要做如下工作:

建立一个socket server端,绑定到一个本地socket文件,并监听clients的连接。

建立一个或多个socket client端,连接server。

client和server相互发送消息。

client或server收到对方消息后,针对具体消息进行相应处理。

ubus同样实现了上述组件,并对socket连接以及消息传输和处理进行了封装:

1. ubus提供了一个socket server:ubusd。因此开发者不需要自己实现server端。

2. ubus提供了创建socket client端的接口,并且提供了三种现成的客户端供用户直接使用:

        1) 为shell脚本提供的client端。

        2) 为lua脚本提供的client接口。

        3) 为C语言提供的client接口。

可见ubus对shell和lua增加了支持,后面会介绍这些客户端的用法。

3. ubus对client和server之间通信的消息格式进行了定义:client和server都必须将消息封装成json消息格式。

4. ubus对client端的消息处理抽象出“对象(object)”和“方法(method)”的概念。一个对象中包含多个方法,client需要向server注册收到特定json消息时的处理方法。对象和方法都有自己的名字,发送请求方只需在消息中指定要调用的对象和方法的名字即可。

使用ubus时需要引用一些动态库,主要包括:

libubus.so:ubus向外部提供的编程接口,例如创建socket,进行监听和连接,发送消息等接口函数。

libubox.so:ubus向外部提供的编程接口,例如等待和读取消息。

libblobmsg.so,libjson.so:提供了封装和解析json数据的接口,编程时不需要直接使用libjson.so,而是使用libblobmsg.so提供的更灵活的接口函数。

ubus可用于两个进程之间的通信,并以类似json格式进行数据交互。

ubus的常见场景为:

“客户端--服务器”形式的交互,即进程A注册一系列的服务,进程B去调用这些服务。

ubus支持以“订阅 -- 通知”的方式进行进程通信,即进程A提供订阅服务,其他进程可以选择订阅或退订该服务,进程A可以向所有订阅者发送消息。

由于ubus实现方式的限制,在一些场景中不适宜使用ubus:

ubus用于少量数据的传输,如果数据量很大或是数据交互很频繁,则不宜用ubus。经过测试,当ubus一次传输数据量超过60KB,就不能正常工作了。

ubus对多线程支持的不好,例如在多个线程中去请求同一个服务,就有可能出现不可预知的结果。

不建议递归调用ubus,例如进程A去调用进程B的服务,而B的该服务需要调用进程C的服务,之后C将结果返回给B,然后B将结果返回给A。如果不得不这样做,需要在调用过程中避免全局变量的重用问题。

NNG

参考:

nng 概述-CSDN博客

NNG/nanomsg 是一个通信库,用来实现进程间过程调用和线程间通信,很是方便。

NNG 将通信使用的协议和传输分离,类似与 TCP/IP 的应用层和传输层的分层,同时接口上屏蔽了底层细节,统一用字符串 URL 来描述传输模式。这样当使用场景修改时,可以通过简单修改 URL 来实现适应,极具灵活性。

注意,NNG是基于socket实现的。

注意 

在实际的Linux应用中,人们更多地趋向于使用UNIX域套接字,而不是System V IPC中的消息队列等机制。 

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值