专利名称:利用虚拟字符设备和genetlink实现Linux系统中进程间通信的方法
技术领域:
本发明涉及一种实现Linux系统中进程间通信的方法,尤其是一种利用虚拟字符 设备和genetlink实现Linux系统中进程间通信的方法。
背景技术:
在嵌入式系统中,通常一个应用程序需要将自己的状态通知给系统中其它相关进 程,或则将数据发送给其它相关的进程。利用传统的Linux系统的进程间通信方法不能有 效的解决多个进程间的通信问题。目前,Linux系统中常见的进程间通信的方法有以下几种管道(pipe),命名管道 (FIFO),消息队列(message queue),共享内存(shared memory),信号量(semaphore),信号 (signal)和套接字(Socket)。这些现有的进程间通信方法的特点如下(1)管道(pipe)管道只允许一个进程和另一个与它同族的进程之间进行通信, 而不能满足任意进程间的通信;(2)命名管道(FIFO)类似于管道,但是它可以用于任何两个进程之间的通信, 命名管道在文件系统中有对应的文件名;命名管道通过命令mkfifo/mknod或系统调用 mkfifo来创建,只能实现单向的输出传入,而且传入的数据大小受限制;(3)信号(signal)信号是比较复杂的通信方式,用于通知接收进程有某种事情 发生,除了用于进程间通信外,进程还可以发送信号给进程本身,但是传输的数据信息有 限,只能是预先定义好的事件;(4)消息队列(message queue)消息队列提供了一种在两个不相关的进程之间 传递数据的有效方法,其特点是传递数据的长度有限制,只能用于两个进程之间;(5)信号量(semaphore)信号量主要作为进程间以及同进程不同线程之间的同 步手段,其特点是传输的数据信息有限,通常用于进程间的同步处理;(6)共享内存(shared memory)通过相关原语,它使得多个进程可以访问同一块 内存空间,其特点是编程复杂,常常需要借组其它同步处理完成进程间的数据同步;(7)套接字(Socket)它是更为通用的进程间通信机制,常用于不同机器之间的 进程间通信,socket通信需要占用一个IP地址和端口号,且效率比较低。这些现有的进程间通信方法,除共享内存的方法可以用于多个进程间通信外,其 它通信方法只能由于两个进程之间,不能实现多个进程之间的通信;但是,共享内存的进 程间通信方法存在有编程复杂、需要借助于其它同步原语才能实现多个进程间的通信的问 题。
发明内容
本发明是为避免上述已有技术中存在的不足之处,提供一种利用虚拟字符设备和 genetlink实现Linux系统中进程间通信的方法,以实现Linux系统中进程间的同步通信和异步通信,并使得编程过程简化。利用虚拟字符设备和genetlink实现Linux系统中进程间通信的方法,其特征是 包括以下步骤a.在Linux内核态创建一个虚拟字符设备,虚拟字符设备向Linux内核注册该虚 拟字符设备的驱动程序;b.所述虚拟字符设备的驱动程序向Linux内核态文件系统注册Linux内核态文件 系统的操作接口,再向netlink模块注册genetlink协议类型和操作接口 ;c.消息发布进程通过文件系统的Open接口,获取访问虚拟字符设备的文件句柄;d.消息接收进程通过Socket接口,向genetlink注册消息接收进程和接收的消息 类型;e.消息发布进程通过虚拟字符设备的IOCTL操作,将消息发布进程发布的消息通 过系统调用的方式,传递给内核态的虚拟字符设备的驱动程序;f.所述虚拟字符设备的驱动程序将所述发布的消息封装为genetlink要求的格 式,并通过Socket接口将所述发布的消息传递到Socket队列;g.如果消息是同步发送,所述虚拟字符设备驱动程序等待各个消息接收进程的处 理结果,并将处理结果通过函数调用的输出参数返回给消息发布进程;如果消息是异步发 送,所述虚拟字符设备驱动程序则将控制权返回给消息发布进程。与已有技术相比,本发明有益效果体现在本发明实现Linux系统中进程间通信的一种方法,创建一个用于进程间通信的虚 拟字符设备,通过虚拟字符设备和Genetlink实现消息的发送,利用虚拟字符设备将消息 的处理结果返回给消息发布进程,实现多个进程之间的数据通信,实现消息的同步通信和 异步通信。由于利用了 Linux内核实现消息处理,用户态编程时不需要借助于其它同步原 语(例如信号和信号量机制)来保证消息同步处理,编程接口是文件的Open、Close和 IOCTL操作接口和Socket相关操作接口,简单易实现。
图1为本发明的利用虚拟字符设备和genetlink实现Linux系统中进程间通信的 方法的流程图。图2为接口管理进程和ARP进程的通信处理过程的示意图。以下通过具体实施方式
,并结合附图对本发明作进一步说明。
具体实施例方式如图1所示,利用虚拟字符设备和genetlink实现Linux系统中进程间通信的方 法,其特征是包括以下步骤a.在Linux内核态创建一个虚拟字符设备,虚拟字符设备向Linux内核注册该虚 拟字符设备的驱动程序;b.所述虚拟字符设备的驱动程序向Linux内核态文件系统注册Linux内核态文件 系统的操作接口,再向netlink模块注册genetlink协议类型和操作接口 ;c.消息发布进程通过文件系统的Open接口,获取访问虚拟字符设备的文件句柄;
d.消息接收进程通过Socket接口,向genetlink注册消息接收进程和接收的消息 类型;e.消息发布进程通过虚拟字符设备的IOCTL操作,将消息发布进程发布的消息通 过系统调用的方式,传递给内核态的虚拟字符设备的驱动程序;f.所述虚拟字符设备的驱动程序将所述发布的消息封装为genetlink要求的格 式,并通过Socket接口将所述发布的消息传递到Socket队列;g.如果消息是同步发送,所述虚拟字符设备驱动程序等待各个消息接收进程的处 理结果,并将处理结果通过函数调用的输出参数返回给消息发布进程;如果消息是异步发 送,所述虚拟字符设备驱动程序则将控制权返回给消息发布进程。如图2所示,以接口管理进程和ARP进程的通信处理过程为例,采用本发明的通信 方法的同步通信的通信流程如下1)在Linux系统启动阶段,虚拟字符设备向Linux内核注册虚拟字符设备的驱动 程序(具体表现为创建一个struct cdev对象,并将该对象添加到Linux内核中;向内核 态文件系统注册文件操作接口,常用的接口有open、close、ioctl);2)虚拟字符设备的驱动程序向netlink注册genetlink协议类型和消息处理接 Π ;3)接口管理进程(本实施例中作为消息发布进程)通过文件系统Open接口,获取 访问虚拟字符设备的文件句柄;4) ARP进程(本实施例中作为消息接收进程)通过Socket接口,向genetlink注 册消息接收进程和消息类型;5)接口管理进程通过IOCTL接口,发送消息到内核态的文件系统;6)内核态的文件系统根据文件句柄获取虚拟字符设备的IOCTL接口,并通过这个 接口将消息传递到虚拟字符设备的驱动程序,驱动程序把消息通过genetlink/netlink接 口传递给Socket队列; 7) ARP进程通过Socket接口接收数据;8)netlink/genetlink通过虚拟字符设备注册的消息处理接口,将ARP进程通过 Socket接口发送的消息传递给虚拟字符设备;9)虚拟字符设备的驱动程序将消息的处理结果通过IOCTL接口传输到接口管理 进程。对于异步通信的通信流程,无步骤8)和步骤9),其他步骤和上述同步通信的通信 流程相同。本发明中的缩略语和关键术语解释如下Linux 是一个可以自由发布的类UNIX内核实现,它是一个操作系统的底层核心。进程UNIX规范这样定义进程一个其中运行着一个或多个线程的地址空间和这 些线程所需要的系统资源。进程间通信进程之间实现数据的交换和同步。Netlink :Netlink是一种特殊的Socket,它是Linux所特有的、类似于BSD中的 AF ROUTE协议族,但又远比它的功能强大。用于实现内核态和用户态程序的通信。用户态 应用使用标准的Socket API管理Netlink。
Genetlink :Net 1 ink在实现时存在一个相对较大的缺陷只支持32种协议,从 而导致了该协议的扩张性比较差。基于扩展性的考虑,Linux在Netlink基础上提供了 generic netlink子协议。该协议允许注册IOM个协议族,每个协议族可以注册256个命令字。虚拟字符设备没有对应的物理实体,仅利用字符设备特点为用户态程序和内核 态程序提供一种通信机制。同步通信消息的发送者在发送消息后,阻塞、并等待消息的接收者的处理结果。异步通信消息的发送者在发送消息后,不等待消息的处理结果,继续处理规定的 业务。
权利要求
1.利用虚拟字符设备和genetlink实现Linux系统中进程间通信的方法,其特征是包 括以下步骤a.在Linux内核态创建一个虚拟字符设备,虚拟字符设备向Linux内核注册该虚拟字 符设备的驱动程序;b.所述虚拟字符设备的驱动程序向Linux内核态文件系统注册Linux内核态文件系统 的操作接口,再向net link模块注册genetlink协议类型和操作接口 ;c.消息发布进程通过文件系统的Open接口,获取访问虚拟字符设备的文件句柄;d.消息接收进程通过Socket接口,向genetlink注册消息接收进程和接收的消息类型;e.消息发布进程通过虚拟字符设备的IOCTL操作,将消息发布进程发布的消息通过系 统调用的方式,传递给内核态的虚拟字符设备的驱动程序;f.所述虚拟字符设备的驱动程序将所述发布的消息封装为genetlink要求的格式,并 通过Socket接口将所述发布的消息传递到Socket队列;g.如果消息是同步发送,所述虚拟字符设备驱动程序等待各个消息接收进程的处理结 果,并将处理结果通过函数调用的输出参数返回给消息发布进程;如果消息是异步发送,所 述虚拟字符设备驱动程序则将控制权返回给消息发布进程。
全文摘要
本发明公开了一种利用虚拟字符设备和genetlink实现Linux系统中进程间通信的方法。创建一个用于进程间通信的虚拟字符设备,通过虚拟字符设备和Genetlink实现消息的发送,利用虚拟字符设备将消息的处理结果返回给消息发布进程。本发明的实现Linux系统中进程间通信的方法,具有可实现多个进程之间的数据通信、能实现消息的同步通信和异步通信且编程方法简单易实现等优点。
文档编号G06F9/54GK102122255SQ20111006214
公开日2011年7月13日 申请日期2011年3月15日 优先权日2011年3月15日
发明者吴小刚, 唐舜, 李颖和 申请人:合肥华云通信技术有限公司