一种多进程通信方法

文档序号:6444739阅读:177来源:国知局
专利名称:一种多进程通信方法
技术领域
本发明涉及嵌入式技术领域,具体地说,是涉及一种嵌入式系统中的多进程通信方法。
背景技术
伴随着技术的快速发展和嵌入式CPU性能的快速提高,多进程管理及通信技术将会在嵌入式产业体现的愈来愈明显。而如何解决多进程管理间的同步、调度等问题将成为制约嵌入式产业发展的突出问题。比如在数字电视领域中,数字电视一体机的出现,模拟电视系统和数字电视系统两个系统同时并存,使得原先那种只运行一个应用进程的开发平台受到了极大制约。技术上需要多个应用进程并存,在提高系统健壮性的同时,也带来了多个进程之间的管理调度问题,甚至是多进程之间的功能函数共享等提出了迫切的需要。以嵌入式的Iinux系统为例,进程通信方法有多种,如管道通信、消息队列、socket、内存共享等。这些通信方法各有优缺点,比如管道通信的优点是所有的UNIX实现都支持,缺点是只能传递无格式字节流,另外缓冲区大小受限;共享内存通信方式优点是通信效率高,占用内存少,缺点是需要自己进行内存保护和进程间的同步,使用复杂等。但是,现有上述多种通信方法都存在有几个共同的缺点(1)使用不方便每个进程为使用这些通信方法,需要增加大量代码,并需要为所有进程制定共同遵守的标准和协议,这增加了代码的复杂度和编码的工作量,而且运行期间会占用更多的内存空间,降低运行效率;O)由于进程的代码分属不同的进程空间,不同的进程无法访问不属于自己代码空间的地址,所以,这些通信方法均无法实现进程间的函数代码共享。为了实现相同的功能,每个进程都需要实现自己的函数,这进一步增加了代码的复杂度和编码的工作量;(3)多个进程函数的调用还存在同步的问题,也增加了使用的不便和系统的不稳定。上述这些缺点的存在,使得现有多进程通信方法难以满足越来越多的像数字电视一体机等这种存在多个应用进程对进程通信越来越高、越来越细的要求。

发明内容
本发明的目的是针对现有技术存在的上述缺点而提供一种多进程通信方法,以简化编程、提高进程间通信速度、系统运行效率及稳定性。为实现上述技术目的,本发明采用下述技术方案来实现
一种多进程通信方法,该方法包括将一个进程设置为服务器端进程,需要通信的进程均设置为客户端进程,服务器端进程内创建服务器端消息队列,客户端进程内创建客户端消息队列,客户端进程与服务器端进程通过消息队列进行通信,进而通过服务器端进程实现多个客户端进程之间的相互通信。如上所述的多进程通信方法,所述客户端进程与所述服务器端进程通信之前,客户端进程首先采用下述过程注册到服务器端进程根据包含客户端进程路径在内的客户端进程名称创建关键字,根据关键字创建客户端进程的消息队列,并获得队列ID,然后向服务器端进程发出注册请求并存至服务器端消息队列;服务器端进程从服务器端消息队列读取客户端进程注册请求,并在服务器端进程中不存在相同进程名和相同队列ID信息时,将客户端进程的进程名及队列ID信息添加至服务器端进程。如上所述的多进程通信方法,注册到所述服务器端进程的客户端进程采用下述过程将本进程内的函数注册到服务器端进程客户端进程向服务器端进程发出包含函数信息的函数注册请求并存至服务器端消息队列,服务器端进程从服务器端消息队列读取函数注册请求,并在服务器端进程中不存在相同函数信息的注册函数时将请求注册的函数信息添加至服务器端进程中。如上所述的多进程通信方法,注册到所述服务器端进程的第一客户端进程采用下述过程调用注册到服务器端进程的第二客户端进程的函数第一客户端进程向服务器端进程发出包含待调用函数信息的函数调用请求并存至服务器端消息队列,服务器端进程根据待调用函数信息查找所保存的函数注册信息,在找到函数注册信息后将其发送至该函数注册信息所在的第二客户端进程的客户端消息队列;第二客户端进程从其客户端消息队列读取服务器端进程发送的函数注册信息后运行相应的函数,并将运行结果返回至服务器端进程的服务器端消息队列;服务器端进程再将第二客户端进程返回的运行结果发送至第一客户端进程的客户端消息队列。如上所述的多进程通信方法,所述第一客户端进程以读取特定消息的方式读取其客户端消息队列中所述服务器端进程发送的函数调用运行结果消息,并在读取到相应的消息时将运行结果立即返回至第一客户端进程。如上所述的多进程通信方法,若所述第一客户端进程在设定时间内未读取到所述服务器端进程发送的函数调用运行结果消息,则返回函数调用超时至第一客户端进程。如上所述的多进程通信方法,注册到所述服务器端进程的第一客户端进程向服务器端进程发出定时启动/关闭注册到服务器端进程的第二客户端进程的请求至服务器端消息队列,服务器端进程在读取到请求后启动定时器,并在定时时间到时启动/关闭第二客户端进程。如上所述的多进程通信方法,注册到所述服务器端进程的第一客户端进程采用下述过程将其进程的数据传递至注册到服务器端进程的第二客户端进程第一客户端进程将传递至第二客户端进程的数据发送至服务器端进程并存至服务器端消息队列,服务器端进程读取数据并转发至第二客户端进程的客户端消息队列;第二客户端进程在读取到数据后返回数据传递结果至服务器端进程的服务器端消息队列,服务器端进程再将数据传递结果转发至第一客户端进程的客户端消息队列。如上所述的多进程通信方法,注册到所述服务器端进程的客户端进程采用下述过程查询注册到服务器端进程的其他客户端进程的进程信息客户端进程发送进程信息查询请求至服务器端进程并存至服务器端消息队列,服务器端进程读取进程信息查询请求后在本进程内搜集相应的进程信息,并在搜集完成后将进程信息发送至客户端进程的客户端消息队列中。如上所述的多进程通信方法,所述服务器端进程采用系统的守护进程实现。与现有技术相比,本发明的优点和积极效果是本发明的多进程通信方法在消息队列的基础上,采用服务器端/客户端模式实现多个进程之间的相互通信,减少了软件编程复杂度、降低了进程间的耦合度,提高了程序的可重用性和移植性,提升了系统的稳定性和可靠性,可完成进程的无缝切换,实现进程间快速、稳定的调度。结合附图阅读本发明的具体实施方式
后,本发明的其他特点和优点将变得更加清
林疋。


图1是本发明多进程通信方法一个实施例的总体架构图2是本发明多进程通信方法中进程注册一个实施例的实现流程图;图3是本发明多进程通信方法中函数注册及调用一个实施例的实现流程图;图4是本发明多进程通信方法中启动/关闭进程、进程间数据传递及进程信息查询实施例的实现流程图。
具体实施例方式下面结合附图和具体实施方式
对本发明的技术方案作进一步详细的说明。首先,简要说明本发明的设计思路本发明考虑到现有技术中多进程进行通信的方法多是采用进程与进程之间直接通信的方式,在这种方式下,需要为每个进程开发程序,每个进程单独维护大量的程序,而这些程序可能在许多进程中均是相同的,从而导致程序开发工作量大,影响了开发速度;另一方面,由于进程要维护大量的程序,导致进程本身工作效率低、占用内存资源大、运行稳定性差,进而引起多进程通信也存在上述这些缺点。鉴于此,本发明提出了基于服务器端/客户端模式的多进程通信方法,该方法在消息队列底层通信机制的基础上进行扩展,以服务器端进程为核心,统一进程管理接口,从而降低进程间的耦合度,提高程序的重用性和可移植性,提升系统的稳定性和可靠性。请参考图1所示的本发明多进程通信方法一个实施例的总体架构图。在该实施例的架构中,将一个进程设置为服务器端进程11,需要通信的其他进程均设置为客户端进程,分别为客户端进程12、客户端进程13及客户端进程14,服务器端进程11内创建服务器端消息队列,各客户端进程内分别创建客户端消息队列。各客户端进程与服务器端进程11通过消息队列进行通信,从而通过服务器端进程11三个客户端进程之间的相互通信。其中,服务器端进程11是在系统启动即可运行、且是不具有控制台的进程,其启动时也建立了相应的服务器端消息队列。作为优选实施例,服务器端进程11选择系统的守护进程来实现。各客户端进程具体通信过程及可实现的功能可参考图2至图4及下述对相应附图的描述。请参考图2,该图2所示为基于图1架构图的本发明多进程通信方法中进程注册一个实施例的实现流程图。基于图1架构图的多进程通信方法,可以实现客户端进程注册到服务器端进程中,而且,进程注册也是实现多进程通信的基础。如图2所示,以客户端进程12注册到服务器端进程11为例,进程注册可采用下述流程来实现
步骤1-1 客户端进程12调用进程注册接口。该实施例将进程间通信的各功能封装为函数,通过调用函数的形式,利用动态库实现相应的功能。具体来说,客户端进程12调用进程注册接口后,将根据包含客户端进程12的路径在内的客户端进程名称创建关键字Key,然后根据Key创建该进程的客户端消息队列,并通过返回函数获得该消息队列的ID。然后,客户端进程12将根据Key和消息队列ID发出注册请求。在该实施例中,作为优选实施例,客户端进程名称中包含的路径为该进程的绝对路径。步骤1-2 客户端进程12向服务器端进程11发出注册请求,该注册请求将存至服务器端进程11的服务器端消息队列中。步骤1-3 服务器端进程11从服务器端消息队列中读取客户端进程12的进程注册请求,然后查找其进程信息堆栈,检查是否存在相同进程名和相同消息队列ID的进程信息。若不存在,则将客户端进程12的进程名(包含进程路径)及其客户端消息队列ID添加至服务器端进程11的进程信息堆栈中,注册客户端进程12成功。在该实施例中,进程信息堆栈是在服务器端进程11中开辟出来、用来存放注册的客户端进程的有关进程信息。而且,服务器端进程11从其服务器端消息队列中读取请求时,可以采用读取队列中的所有消息的方式,也可以采用读取某个特定消息的方式。步骤1-4 在客户端进程12成功注册后,服务器端进程11向客户端进程12返回注册成功消息,将该消息存入至客户端进程12的客户端消息队列中。或者,在步骤1-3中,若服务器端进程11检查到其进程信息堆栈中已经存在相同进程名和相同消息队列ID的进程信息,则向客户端进程12返回注册失败消息,该消息同样存入至客户端进程12的客户端消息队列中,而客户端进程12可通过读取消息队列消息而获得是否成功注册到服务器端进程11。请参考图3,该图3所示为基于图1架构图的本发明多进程通信方法中函数注册及调用一个实施例的实现流程图。现有多进程通信方法由于是进程之间直接进行通信,无法实现进程间函数的共享。而本发明借助于服务器端进程进行通信,可以实现进程间函数的调用和共享。首先,客户端进程可将其所拥有的函数注册到服务器端进程中,这样,其他注册到服务器端进程的客户端进程就可以调用这些函数。具体实现过程如下所述
步骤2-1至步骤2-3示出了注册到服务器端进程11的客户端进程12将其所拥有的函数注册到服务器端进程11的函数注册过程,具体如下
步骤2-1 已注册到服务器端进程11的客户端进程12若要想在进程间共享其进程内所拥有的函数时,需要向服务器端进程11发出包含函数信息的函数注册请求,该请求存至服务器端进程11的服务器端消息队列中。其中,函数信息包括函数所在的客户端进程名称、函数名称、函数的参数类型、函数地址等信息。步骤2-2 服务器端进程11从其服务器端消息队列中读取客户端进程12的函数注册请求,然后查找其函数信息堆栈,检查是否存在相同函数信息的注册函数。若不存在,则将该函数信息添加至函数信息堆栈中,客户端进程12函数注册成功。在该实施例中,函数信息堆栈是在服务器端进程11中开辟出来、用来存放注册的客户端进程的函数的有关fn息ο步骤2-3 在客户端进程12成功注册其函数后,服务器端进程11向客户端进程12返回函数注册成功消息,将该消息存入至客户端进程12的客户端消息队列中。或者,在步骤2-2中,若服务器端进程11检查到其函数信息堆栈中已经存在相同函数信息的注册函数,则向客户端进程12返回注册错误消息,该消息同样存入至客户端进程12的客户端消息队列中,而客户端进程12可通过读取消息队列消息而获得是否成功将其要共享的函数注册到服务器端进程11。在该实施例中,客户端进程12将其函数注册到服务器端进程11之后,注册到服务器端进程11的另外的客户端进程13可以调用相应的函数,实现进程间函数的共享,具体实现过程如下
步骤3-1 客户端进程13向服务器端进程11发出包含待调用函数信息的函数调用请求,该调用请求存入服务器端进程11的服务器端消息队列中。例如,待调用函数信息为客户端进程12已经注册的函数信息。步骤3-2 服务器端进程11根据待调用函数信息查找其函数信息堆栈中所保存的函数注册信息。若找到函数注册信息,例如,找到客户端进程12的函数注册信息,执行步骤3-3 ;若未找到函数注册信息,则执行步骤3-6。步骤3-3 服务器端进程11将找到的函数信息发送至客户端进程12所在的客户端消息队列。步骤3-4 客户端进程12从其客户端消息队列中读取到服务器端进程11发送的函数注册信息,将到其代码空间中运行相应的函数,获得函数运行结果。步骤3-5 客户端进程12将函数运行结果返回至服务器端进程11的服务器端消息队列。步骤3-6 服务器端进程11将客户端进程12返回的函数运行结果发送至客户端进程13的客户端消息队列,或者在步骤3-2未找到函数注册信息时,返回调用错误信息至客户端进程13的客户端消息队列。在该实施例中,客户端进程13可以采用读取队列中所有消息的方式或采用读取某个特定消息的方式来读取其客户端消息队列中的函数调用结果消息。作为优选实施例,为实现函数调用的快速反馈,采用读取某个特定消息的方式读取其客户端消息队列中服务器端进程11发送的函数调用运行结果消息。而且,为实现阻塞返回,防止因其他进程函数运行错误而影响本进程的事务处理,该实施例还在客户端进程13从其客户端消息队列中读取到相应的消息时将相应的运行结果立即返回客户端进程13的返回方式。并且,若客户端进程13在设定时间内未读取到服务器端进程11发送的函数调用运行结果消息,则返回函数调用超时的结果至客户端进程13中。此外,不同客户端进程通过服务器端进程11,还可以实现启动/关闭进程、进程间数据传递以及进程信息查询等功能,具体请参考图4示出的本发明多进程通信方法中启动/关闭进程、进程间数据传递及进程信息查询实施例的实现流程图。该实施例仍以注册到服务器端进程11的客户端进程12和客户端进程13为例进行介绍。客户端进程12可以通过下述步骤4-1至步骤4-4来定时启动或关闭客户端进程13。步骤4-1 客户端进程12向服务器端进程11发出定时启动/关闭客户端进程13的请求至服务器端消息队列中。步骤4-2 服务器端进程11在从其服务器端消息队列中读取到相应的请求后启动定时器。步骤4-3 定时器定时时间到后,通知服务器端进程11。步骤4-4 在定时时间到后,服务器端进程11启动/关闭客户端进程13。客户端进程12可以通过下述步骤5-1至步骤5-4将其数据传递至客户端进程13中,实现进程间的数据传递。步骤5-1 客户端进程12将要传递至客户端进程13的数据发送至服务器端进程11并存至服务器端消息队列中。步骤5-2 服务器端进程11从其消息队列中读取数据并转发至客户端进程13的客户端消息队列中。步骤5-3 客户端进程13在读取到数据后返回数据传递结果至服务器端进程11的服务器端消息队列。步骤5-4 服务器端进程11将数据传递结果转发至客户端进程12的客户端消息队列中。上述数据传递过程是以客户端进程12主动进行传递开始的,当然,并不局限于此,也可以是客户端进程13先向服务器端进程11发出获取客户端进程12的数据的请求,服务器端进程11将请求转发至客户端进程12,然后,再执行上述的数据传递过程。此外,客户端进程12还可以通过下述步骤6-1至步骤6-3查询其他注册到服务器端进程11的客户端进程1进程信息,实现进程间的进程信息查询,具体如下
步骤6-1 客户端进程12发送进程信息查询请求至服务器端进程11,并将请求存至服务器端消息队列。步骤6-2 服务器端进程11从其服务器端消息队列中读取进程信息查询请求,在本进程内搜集相应的进程信息,并在搜集完成后将进程信息发送至客户端进程12的客户端消息队列中。客户端进程12可以通过读取其客户端消息队列而获得所需要的其他进程的信息。由于要进行通信的客户端进程首先要注册到服务器端进程11上,所以,服务器端进程11能获知并存储客户端进程的进程信息,因此,在其他客户端进程存在进程信息查询请求后,服务器端进程11可直接在本进程内查找相关的进程信息。以上实施例仅用以说明本发明的技术方案,而非对其进行限制;尽管参照前述实施例对本发明进行了详细的说明,对于本领域的普通技术人员来说,依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或替换,并不使相应技术方案的本质脱离本发明所要求保护的技术方案的精神和范围。
权利要求
1.一种多进程通信方法,其特征在于,将一个进程设置为服务器端进程,需要通信的进程均设置为客户端进程,服务器端进程内创建服务器端消息队列,客户端进程内创建客户端消息队列,客户端进程与服务器端进程通过消息队列进行通信,进而通过服务器端进程实现多个客户端进程之间的相互通信。
2.根据权利要求1所述的多进程通信方法,其特征在于,所述客户端进程与所述服务器端进程通信之前,客户端进程首先采用下述过程注册到服务器端进程根据包含客户端进程路径在内的客户端进程名称创建关键字,根据关键字创建客户端进程的消息队列,并获得队列ID,然后向服务器端进程发出注册请求并存至服务器端消息队列;服务器端进程从服务器端消息队列读取客户端进程注册请求,并在服务器端进程中不存在相同进程名和相同队列ID信息时,将客户端进程的进程名及队列ID信息添加至服务器端进程。
3.根据权利要求2所述的多进程通信方法,其特征在于,注册到所述服务器端进程的客户端进程采用下述过程将本进程内的函数注册到服务器端进程客户端进程向服务器端进程发出包含函数信息的函数注册请求并存至服务器端消息队列,服务器端进程从服务器端消息队列读取函数注册请求,并在服务器端进程中不存在相同函数信息的注册函数时将请求注册的函数信息添加至服务器端进程中。
4.根据权利要求3所述的多进程通信方法,其特征在于,注册到所述服务器端进程的第一客户端进程采用下述过程调用注册到服务器端进程的第二客户端进程的函数第一客户端进程向服务器端进程发出包含待调用函数信息的函数调用请求并存至服务器端消息队列,服务器端进程根据待调用函数信息查找所保存的函数注册信息,在找到函数注册信息后将其发送至该函数注册信息所在的第二客户端进程的客户端消息队列;第二客户端进程从其客户端消息队列读取服务器端进程发送的函数注册信息后运行相应的函数,并将运行结果返回至服务器端进程的服务器端消息队列;服务器端进程再将第二客户端进程返回的运行结果发送至第一客户端进程的客户端消息队列。
5.根据权利要求4所述的多进程通信方法,其特征在于,所述第一客户端进程以读取特定消息的方式读取其客户端消息队列中所述服务器端进程发送的函数调用运行结果消息,并在读取到相应的消息时将运行结果立即返回至第一客户端进程。
6.根据权利要求5所述的多进程通信方法,其特征在于,若所述第一客户端进程在设定时间内未读取到所述服务器端进程发送的函数调用运行结果消息,则返回函数调用超时至第一客户端进程。
7.根据权利要求2所述的多进程通信方法,其特征在于,注册到所述服务器端进程的第一客户端进程向服务器端进程发出定时启动/关闭注册到服务器端进程的第二客户端进程的请求至服务器端消息队列,服务器端进程在读取到请求后启动定时器,并在定时时间到时启动/关闭第二客户端进程。
8.根据权利要求2所述的多进程通信方法,其特征在于,注册到所述服务器端进程的第一客户端进程采用下述过程将其进程的数据传递至注册到服务器端进程的第二客户端进程第一客户端进程将传递至第二客户端进程的数据发送至服务器端进程并存至服务器端消息队列,服务器端进程读取数据并转发至第二客户端进程的客户端消息队列;第二客户端进程在读取到数据后返回数据传递结果至服务器端进程的服务器端消息队列,服务器端进程再将数据传递结果转发至第一客户端进程的客户端消息队列。
9.根据权利要求2所述的多进程通信方法,其特征在于,注册到所述服务器端进程的客户端进程采用下述过程查询注册到服务器端进程的其他客户端进程的进程信息客户端进程发送进程信息查询请求至服务器端进程并存至服务器端消息队列,服务器端进程读取进程信息查询请求后在本进程内搜集相应的进程信息,并在搜集完成后将进程信息发送至客户端进程的客户端消息队列中。
10.根据权利要求1至9中任一项所述的多进程通信方法,其特征在于,所述服务器端进程为系统的守护进程。
全文摘要
本发明公开了一种多进程通信方法,该方法将一个进程设置为服务器端进程,需要通信的进程均设置为客户端进程,服务器端进程内创建服务器端消息队列,客户端进程内创建客户端消息队列,客户端进程与服务器端进程通过消息队列进行通信,进而通过服务器端进程实现多个客户端进程之间的相互通信。利用本发明所述的通信方法进行多进程通信,可以简化进程编程、提高进程间通信速度、系统运行效率及稳定性。
文档编号G06F9/54GK102591726SQ201110457848
公开日2012年7月18日 申请日期2011年12月31日 优先权日2011年12月31日
发明者刘庆彬, 周印伟 申请人:青岛海信宽带多媒体技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1