【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们讨论过,目前在linux系统上面有很多办法可以实现多进程数据共享。这里面比如说管道,比如说共享内存,比如说网络等等。但是这几种方法,总觉得使用不是很方便。管道的话,需要了解对应api;共享内存,则需要了解boost库;而网络编程,一般都需要找一个比较靠谱一点的网络库。思来想去,完全可以通过驱动的方法,实现进程间通信。
1、设计一个字符设备的驱动
我们都知道,linux下面有三种设备,分别是字符设备、块设备和网络设备。因为我们驱动设置的目的,主要就是为了共享内存使用的,所以这里选用最简单的字符设备就可以了。
sudo insmod share_memory.ko
如果需要删除的话,也简单
sudo rmmod share_memory
调试打印方法,
sudo dmesg
2、驱动代替了消息分发的功能
如果有了这个带消息分发功能的驱动,其实就没有必要存在消息分发的应用程序了。因为驱动本身就替我们完成了这样一个工作。驱动启动之后呢,就等着各个模块注册。每个模块自己需要哪些信息,会发送哪些信息,这部分都是可以自定义的。
3、模块收发两条线
每个模块注册的时候,都要给两个内存,一个是发的memory,一个是收的memory。驱动收到对应的消息之后,会把这个消息转发给对应的模块。因此,每一个模块还要有一个收的memory,这个memory主要是用来接收从别的模块那里传递过来的消息。
4、需要一个分析和debug驱动的应用程序
一开始的时候,肯定需要一个应用程序来分析一下驱动程序的功能和性能。比如,某个模块收不到消息,某个模块发不出去消息等等,都需要这个应用程序来看下。还有就是性能,理论上说速度是非常快的,但是这里面难免会出现代码bug的情况,所以有一个能调试的应用程序本身,还是非常有必要的。
5、各子程序安全推出阻塞函数
既然是程序读写,就不可避免地遇到驱动的阻塞函数。这个时候如果强行kill的时候,一定要对现场进行清理和恢复工作。这样下次程序重新加载的时候,还能正常运行使用,不会遇到其他意想不到的问题。
6、辅助sdk的帮助
除了上面的驱动代码之外,还需要一些辅助代码的帮助,这些主要体现在消息的接受上面,因为发送不会遇到这样的问题。假设我们消息接收的时候,希望有一些特定的函数去处理它,这个时候用户一般注册一个bind函数就好了。但是后台处理的时候,一般还需要sdk做一些额外的工作,比如说消息的bind,比如说函数的查找,再比如是不是需要多线程一起处理等等。这些工作对于使用的同学来说不一定是可见的,所以还需要sdk来进行相应的处理工作。