进程间通信方法及装置与流程

文档序号:13685622阅读:206来源:国知局
进程间通信方法及装置与流程

本发明涉及通信技术领域,具体涉及一种进程间通信方法及装置。



背景技术:

进程是计算机资源分配的最小单位,每个进程都拥有自己的独立资源,并与其他进程相互隔离。为了使不同的进程能够互相访问资源并协调工作,操作系统提供了多种进程间通信(inter-processcommunication,简称为ipc)机制,例如管道、共享内存、socket等。

在当前不断发展的计算机技术的背景下,多个进程同时与一个主进程进行通信的情况频频涌现,例如采用了多进程、微内核的第三方应用平台,其承载着大量可能分布在各个进程的第三方应用和服务。在各应用与平台之间相互通信时,多个进程与主进程间的通信需求非常大,对ipc模块的性能和灵活性要求很高。

然而,在上述应用背景下,由于一个进程(通常也称为程序)有时需要同时集成多个软件开发工具包(softwaredevelopmentkit,简称为sdk)来实现期望功能。但当这些sdk中存在名称相同但参数不同的冲突接口或数据类型时,可能会引起程序编译失败或运行时加载sdk失败。现有技术中,通常修改sdk以解决这些冲突;当由于客观原因不能修改sdk时,使用多个子进程分别加载不同的sdk以解决这些问题。

与此同时,对稳定性要求较高的sdk,还需要对各种异常情况做出合适处理,如:子进程异常退出时需要将其立即再启动、子进程未退出但业务阻塞导致失去响应时主程序要及时感知、子进程若启动较慢则不能立即通讯、主进程异常退出后再次启动时需要支持与子进程重新建立通讯等。此外,实现一种对各种子进程通用的做法,可方便扩展支持其他sdk或集成其他子进程,也是要解决的一个问题。



技术实现要素:

因此,本发明要解决的技术问题在于克服现有技术中集成多个可能冲突的sdk存在的困难及多个子进程的控制存在各种问题的缺陷,从而提供一种进程间通信方法及装置。

本发明第一方面提供了一种进程间通信方法,包括以下步骤:

主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号,所述第一应答信号包括身份标识,所述身份标识用于唯一标识对应的子进程,所述第一sdk模块用于实现所述主进程的通信控制,所述第二sdk模块用于实现一个或多个子进程的通信控制;

所述第一sdk模块根据所述主进程的通信状态,向对应于所述身份标识的子进程发送第二应答信号,所述子进程通过所述第二sdk模块接收所述第二应答信号;

进行所述主进程与所述子进程之间的通信,其中,所述主进程通过所述第一sdk模块的第一回调函数接口和第一发送消息接口实现通信,所述子进程通过所述第二sdk模块的第二回调函数接口和第二发送消息接口实现通信。

可选地,所述主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号的步骤之前,还包括:

初始化所述第一sdk模块和所述第二sdk模块;

建立所述主进程和所述一个或多个子进程之间的网络连接,所述一个或多个子进程通过所述第二sdk模块向所述第一sdk模块的网络连接端口发送连接请求。

可选地,所述初始化所述第一sdk模块,包括:

对应于所有所述一个或多个子进程创建第一线程,所述第一线程用于所述网络连接的监控;

对应于每个所述子进程分别创建的第二线程和第三线程,所述第二线程用于创建第一消息队列处理其存储的所述第一线程和所述第三线程发送的线程消息,所述第三线程用于监测所述子进程的存活状态;

对应于每个所述子进程分别创建的第一本地消息列表,用于存储第二sdk模块发送的消息;

和,

所述初始化所述第二sdk模块,包括:

对应于所有所述子进程创建第四线程,所述第四线程用于所述网络连接的监控;

对应于每个所述子进程分别创建的第五线程,所述第五线程用于进程间通信消息的处理;

对应于每个所述子进程分别创建的第二本地消息列表,用于存储所述第一sdk模块发送的消息。

可选地,所述初始化所述第一sdk模块,还包括:调用所述第一sdk模块的启动接口,并将所述启动接口的状态设置为第一状态。

可选地,所述第一消息队列存储的线程消息,包括:

第一消息,用于表示所述第一sdk模块存储的所述子进程的存活状态与所述第三线程监测的所述子进程的存活状态是否一致的消息;

第二消息,用于表示所述第一线程向所述第二线程发送的消息;

第三消息,用于表示根据所述第一消息所触发的定时器消息。

可选地,所述第一sdk模块根据所述主进程的通信状态,向对应于所述身份标识的子进程发送第二应答信号,包括以下步骤:

判断所述主进程是否做好通信准备;

在所述主进程的通信状态为已准备好通信时,将所述第一sdk模块的启动接口的状态设置为第二状态;

所述第一sdk模块向对应于所述身份标识的子进程发送第二应答信号。

可选地,进行所述主进程与所述子进程之间的通信,包括:

所述主进程调用所述第一sdk模块的发送消息接口发送通信信息或所述子进程通过调用所述第二sdk模块的发送消息接口发送通信信息;

所述子进程调用所述第二sdk模块的所述第二回调函数接口接收所述通信信息或所述主进程通过调用所述第一sdk模块的所述第一回调函数接口接收所述通信信息。

本发明第二方面提供了一种进程间通信装置,包括:

接收模块,用于主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号,所述第一应答信号包括身份标识,所述身份标识用于唯一标识对应的子进程,所述第一sdk模块用于实现所述主进程的通信控制,所述第二sdk模块用于实现一个或多个子进程的通信控制;

发送模块,用于所述第一sdk模块根据所述主进程的通信状态,向对应于所述身份标识的子进程发送第二应答信号,所述子进程通过所述第二sdk模块接收所述第二应答信号;

通信模块,用于进行所述主进程与所述子进程之间的通信,其中,所述主进程通过所述第一sdk模块的第一回调函数接口和第一发送消息接口实现通信,所述子进程通过所述第二sdk模块的第二回调函数接口和第二发送消息接口实现通信。

本发明第三方面提供了一种通信终端,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器执行本发明第一方面中任一项所述的进程间通信方法。

本发明第四方面提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使计算机执行本发明第一方面中任一项所述的进程间通信方法。

本发明技术方案,具有如下优点:

1.本发明提供的进程间通信方法,包括:主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号,所述第一应答信号包括身份标识,所述身份标识用于唯一标识对应的子进程,所述第一sdk模块用于实现所述主进程的通信控制,所述第二sdk模块用于实现一个或多个子进程的通信控制;所述第一sdk模块根据所述主进程的通信状态,向对应于所述身份标识的子进程发送第二应答信号,所述子进程通过所述第二sdk模块接收所述第二应答信号;进行所述主进程与所述子进程之间的通信,其中,所述主进程通过所述第一sdk模块的第一回调函数接口和第一发送消息接口实现通信,所述子进程通过所述第二sdk模块的第二回调函数接口和第二发送消息接口实现通信。本发明分别通过第一sdk模块和第二sdk模块分别实现主进程和子进程的通信控制,其中,主进程通过第一sdk模块接收第二sdk模块发送的带有子进程身份标识的第一应答信号,从而能够避免在通信过程中集成多个sdk模块所导致的集成困难的问题。

2.本发明提供的进程间通信方法,所述主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号的步骤之前,还包括:初始化所述第一sdk模块和所述第二sdk模块;建立所述子进程之间的网络连接,所述子进程通过所述第二sdk模块向所述第一sdk模块的网络连接端口发送连接请求。本发明实施例通过在第二sdk模块发送第一应答信号之前,建立主进程和子进程之间的网络连接,从而能够保证进程间通信的效率。

3.本发明提供的进程间通信方法,进行所述主进程与所述子进程之间的通信,包括以下步骤:所述主进程调用所述第一sdk模块的发送消息接口发送通信信息或所述子进程通过调用所述第二sdk模块的发送消息接口发送通信信息;所述子进程调用所述第二sdk模块的所述第二回调函数接口接收所述通信信息或所述主进程通过调用所述第一sdk模块的所述第一回调函数接口接收所述通信信息。本发明实施例通过第一sdk模块的发送消息接口和第二sdk模块的发送消息接口实现主进程与子进程之间的通信信息的发送,通过分别通过第一sdk模块的第一回调函数接口和第二sdk模块的第一回调函数接口分别实现对应的通信信息的接收,通过集成化的第一sdk模块和第二sdk模块,能够实现通用的方便扩展的实现多个子进程与主进程之间的通信。

附图说明

通过参考附图会更加清楚的理解本发明的特征和优点,附图是示意性的而不应理解为对本发明进行任何限制,在附图中:

图1示出了本发明实施例中进程间通信的一个具体示例的系统框架图;

图2示出了本发明实施例1中进程间通信方法的一个具体示例的流程图;

图3示出了本发明实施例2中进程间通信方法的一个具体示例的流程图;

图4示出了本发明实施例3中进程间通信方法的一个具体示例的流程图;

图5为本发明实施例4中通信模块的一个具体示例的结构图;

图6为本发明实施例5中通信模块的一个具体示例的结构图;

图7为本发明实施例6中通信终端的一个具体示例的结构图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得。

本发明实施例中的进程间通信方法可以应用于单个通信终端上。在本发明实施例的阐述过程中,以多个子进程同时与一个主进程之间进行通信的方式描述,当实际操作仅涉及到两个进程之间的通信时,可以将相关实施例简化为一个子进程与一个主进程之间的通信。

本发明实施例中进程间通信的系统框架结构图,如图1所示,其中,“sdk/进程…会话”是指主进程调用sdk或控制子进程实现对应功能时的业务控制模块。由于sdka和sdkb存在接口冲突,采用第一sdk模块和第二sdk模块解决该问题。第一sdk模块对应于主进程设置,第二sdk模块对应于子进程设置,即在进程间通信过程中,所有主进程都通过第一sdk模块进行控制,所有子进程都通过第二sdk模块进行控制。其中,第一sdk模块和第二sdk模块为封装好的通信工具包,其留有一定的函数接口,以便在通信过程中调用,进行相应的处理。

实施例1

本实施例提供一种进程间通信方法,应用于通信终端上,如图2所示,包括如下步骤:

步骤s11,主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号,第一应答信号包括身份标识,身份标识用于唯一标识对应的子进程,第一sdk模块用于实现主进程的通信控制,第二sdk模块用于实现一个或多个子进程的通信控制。

本实施例中,第一sdk模块可以包括:初始化/退出接口、网络连接端口、设置子进程信息接口以及第一发送消息接口等等;其中,子进程信息主要包括:子进程类型和所在路径、是否启动标识以及多个回调函数指针。

第二sdk模块的接口可以包括:初始化/退出接口、设置子进程类型和连接端口、设置回调函数指针接口以及给第二发送信息接口等等。

本实施例中,在第二sdk模块中调用“子进程连接状态变更”的回调函数,从而使得子进程获知自身的连接状态。当该回调函数回调的“子进程连接状态变更”的状态为“已连接”时,才可以通过第二sdk模块向第一sdk模块发送第一应答信号。

当在第一sdk模块中调用“子进程连接状态变更”的回调函数,从而使得主进程获知子进程的连接状态。当该回调函数回调的“子进程连接状态变更”状态为“已连接”时,主进程获知子进程为已连接状态。

此外,第一应答信号用于表示子进程已经做好通信准备。其中,子进程的身份标识即子进程的类型可以是一个整数,也可以是一个字符串等等。本实施例中,子进程类型为一个整数值。在主进程中把所有支持启动的子进程类型设定为一个连续的整数范围,例如:x+1、x+2、x+3…x+4,从而便于第一sdk模块与第二sdk模块的处理。其中哪种类型值代表哪种子进程,这是事先人为约定的,例如:x+1、x+2分别代表进程p1、p2,则子进程p1、p2在调用第二sdk模块的设置子进程类型和连接端口设置类型时就使用参数x+1、x+2;主进程需要启动或停止子进程p1、p2时就调用第一sdk模块的设置子进程信息接口,信息中的子进程类型项对应填x+1、x+2。

步骤s12,第一sdk模块根据主进程的通信状态,向对应于身份标识的子进程发送第二应答信号,子进程通过第二sdk模块接收第二应答信号。

由于子进程向主进程发送连接且连接成功,子进程可以立即感知到,但是主进程不会,因此子进程需要再向主进程发送第一应答信号,并接收到主进程回复的第二应答信号后才能认为双方都做好准备可以进行其他业务通信。

本实施例中,主进程在收到第二sdk模块发送的第一应答信号后,需要检查自身是否做好通信准备,只有第一sdk模块在主进程已做好通信准备时,向对应于身份标识的子进程发送第二应答信号。其中,主进程的通信准备包括第一sdk模块中的端口连接、线程以及消息队列是否均创建成功。其中,通过第一sdk模块以及第二sdk模块各自的“子进程连接状态”的回调函数以及第一应答信号和第二应答信号,能够有效解决如下场景的隐患:主进程、子进程均启动,主进程异常退出,子进程仍连接,这时第二sdk模块会重复尝试连接主进程,当主进程再次启动时,子进程可能在主进程做好通信准备前就先建立了网络连接,如果此时进行通信对主进程可能是不安全的。

步骤s13,进行主进程与子进程之间的通信,其中,主进程通过第一sdk模块的第一回调函数接口和第一发送消息接口实现通信,子进程通过第二sdk模块的第二回调函数接口和第二发送消息接口实现通信。

回调函数在使用过程中,并不需要知道其调用的函数的具体函数名,只要知道它的代理函数名称即可,即在本实施例中,调用第一回调函数时,不需要赋予该第一回调函数其所调用的函数的函数名,只需赋予第一回调函数相应子进程的身份标识,从而使得该第一sdk模块具有通用性。例如:主进程中处理通信信息的函数的函数名为“c1”,那么主进程在调用设置子进程信息接口时,只需要将该函数名作为参数赋给第一回调函数,第一回调函数获取t2回调的子进程的消息后,将该消息作为参数回调给主进程;子进程中处理通信信息的函数的函数名为“c2”,子进程在调用设置回调函数指针接口时,只需要将该函数名作为参数赋给第二回调函数,第二回调函数获取t4回调的主进程的消息后,将该消息作为参数回调给子进程。

本实施例中,第一回调函数为第一sdk模块中“接收消息处理”的回调函数,第二回调函数为第二sdk模块中“接收消息处理”的回调函数。

本发明实施例通过第一sdk模块和第二sdk模块分别实现主进程和子进程的通信控制,其中,主进程通过第一sdk模块接收第二sdk模块发送的带有子进程身份标识的第一应答信号,从而能够避免在通信过程中集成多个sdk模块所导致的集成困难的问题。

实施例2

本施例提供一种进程间通信方法,应用于通信终端上,如图3所示,包括以下步骤:

步骤s21,初始化第一sdk模块和第二sdk模块。

本实施例中,主进程通过调用第一sdk模块的“初始化/退出”接口,进行第一sdk模块的初始化。其中,初始化第一sdk模块主要包括以下三部分:

(1)主进程通过调用第一sdk模块中的“网络连接端口”设置网络连接端口。

本实施例中,第一sdk模块的“网络连接端口”为固定的36000端口,所有子进程都往这个端口发起连接请求,即一个端口可供多个点来连接。

(2)对应于所有子进程创建一个公共线程,即第一线程,对应于每个子进程分别创建两个线程,即第二线程和第三线程。

(3)对应于每个子进程分别创建第一本地消息列表,用于存储子进程通过第二sdk模块发送的消息。

本实施例中,第一线程、第二线程和第三线程在下文的描述中,分别简称为t1、t2和t3。

本实施例中,第一sdk模块的初始化时,对应于所有子进程创建t1,t1称为“socket处理线程”,用于监听socket连接、检测连接断开、socket消息的发送和接收。t1线程收到子进程发来的消息后先放入第一本地消息列表(其中,消息以队列形式存储,遵循先进先出原则),并通过线程消息通知t2处理。

此外,对应于每个子进程创建t2和t3,t2称为“子进程控制线程”,用于处理子进程的启动、退出以及将收到的子进程的消息回调给上层处理;即t2收到t1的通知后会一次性地从第一本地消息列表中取出所有消息,并按序将消息回调给上层处理。这样做可以保证,即便回调函数的执行过程出现阻塞,也不影响进程间消息的继续接收和发送;t3称为“子进程存活监测线程”,当监测到子进程的退出时会通知t2去检查是否需要再次启动。第一sdk模块内部创建公共线程t1,以及分别创建两个线程t2和t3用于支持连接的每种类型的子进程,并等待这些线程启动完成。例如,有n个子进程需要跟主进程进行通信连接,那么在第一sdk模块中总共需要创建2n+1个线程。

其中,在线程t2中创建了第一消息队列(系统资源,以队列的形式存放线程消息),用循环形式依次处理线程收到的消息。其中,处理的消息主要是三种:第一消息、第二消息和第三消息,分别简称为m1、m2和m3。m3称为“定时器消息”,在m1的处理中被触发,触发后会再向本线程发送m1消息;m1称为“子进程状态检查消息”,用于检查上层设置的子进程的启动或停止状态与真实的子进程状态是否一致,不一致则进行再启动或通知其停止,并设置定时器(系统资源,设置后每隔一定时间会自动向本线程发送m3消息,取消后停止发送)进行后期检查,状态一致则取消定时器,其中,设置和取消定时器是通过调用系统函数实现的,设置定时器是采用settimer函数,取消定时器是killtimer函数;m2称为“子进程业务消息”,是线程t1向t2发送的。

线程t3中主要根据子进程的进程句柄(系统资源,作为进程的唯一标识)来监控子进程的存活。其中,子进程的句柄至少可以通过两种方式获得:(1)通过创建子进程的系统函数的返回值获得,即通过创建子进程的系统函数createprocess的返回值来获得对应子进程的进程句柄。

(2)遍历当前系统进程列表,通过进程名称来查找对应项。该过程是通过系统函数实现的,具体实现过程如下:首先通过createtoolhelp32snapshot函数获取当前进程的列表快照;然后通过process32first,获取第一个进程信息,和process32nex,获取后续进程信息,通过循环调用process32nex函数,对进程进行列表遍历。当发现有进程名称与希望查找的一致,则停止遍历;最后,如果在遍历时查找到目标进程,则可以获得其进程id参数,通过openprocess函数可以获取进程的句柄。

此外,判断子进程是否存活可采用以下两种方式:(1)遍历当前系统进程列表;(2)通过系统函数waitforsingleobject实现。

本实施例中,通过选用系统函数waitforsingleobject来判断子进程是否存活。该函数的输入参数为(子进程句柄和等待时间),返回值为等待结果。当等待返回值为wait_object_0,则表示该进程(或线程)已结束,为其他值时表示该进程(或线程)仍存在,从而可以通过该函数返回值来判断子进程是否退出。而该函数在使用时,当要等待的进程(或线程)一直存活,则该函数会在设置的等待时间用完后才返回,否则会在等待的对象结束时马上返回,在等待期间对系统资源的占用较少。为了能够持续地对要监测的进程(或线程)检查是否存活,在该函数在线程t3中是被循环调用的。作为本实施例的一种可选实施方式,等待时间设置为5s,由于,每次函数调用都会对系统资源占用和释放,因此,设置等待时间为5s既能保证等待时间不会太短,即能保证检查的不是太频繁;又能够保证等待时间不会太长,因为关闭主程序时,要等待t3线程的正常结束,而该函数是阻塞执行的,因此等待时间太长会让用户感到主程序退出较慢。

本实施例中,通过选用系统函数waitforsingleobject而不是通过频繁遍历查找系统进程列表来判断子进程是否存活,原因是该函数在等待时间到达前是阻塞式的,会释放系统cpu的占用从而使得其他任务可被执行。另外,该函数的等待时间选择5秒而不是无限等待的原因是只有这样主进程在退出时才能通知本线程自动退出,否则本线程会一直存在直到子进程也退出。

本实施例中,子进程通过调用第二sdk模块的“初始化/退出”接口进行第二sdk模块的初始化。其中,初始化第二sdk模块主要包括以下两部分:

(1)对应于所有子进程创建一个线程,即第四线程,对应于每个子进程创建一个线程,即第五线程。

(2)对应于每个子进程分别创建第二本地消息列表,用于存储主进程通过第一sdk模块发送的消息。

本实施例的下文描述中,将第四线程和第五线程分别简称为t4和t5。

本实施例中,第二sdk模块初始化时,对应于所有子进程设置的t4用于发起socket连接、检测连接断开、socket消息的发送和接收。t4收到主进程发来的消息后放入第二本地消息列表,并通过线程消息通知t5处理。t5与t2类似但功能简化,主要负责在收到t4通知后从第二本地消息列表中取出全部消息并依次回调给子进程上层处理。其中,增加t5主要是为了防止阻塞t4的消息收发。

步骤s22,建立主进程和一个或多个子进程之间的网络连接,一个或多个子进程通过第二sdk模块向第一sdk模块的网络连接端口发送连接请求。

本实施例中,第一sdk模块的“网络连接端口”为固定的36000端口,所有子进程都往这个端口发起连接请求,即一个端口可供多个点来连接。即第一sdk模块的“网络连接端口”支持多个子进程来连接同一个端口,子进程通过第二sdk模块中的“设置连接端口”向该端口发送网络连接请求。

步骤s23,主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号,第一应答信号包括身份标识,身份标识用于唯一标识对应的子进程,第一sdk模块用于实现主进程的通信控制,第二sdk模块用于实现一个或多个子进程的通信控制。与实施例1中的步骤s11相同,不再赘述。

步骤s24,第一sdk模块根据主进程的通信状态,向对应于身份标识的子进程发送第二应答信号,子进程通过第二sdk模块接收第二应答信号。与实施例1中的步骤s12相同,不再赘述。

步骤s25,进行主进程与子进程之间的通信,其中,主进程通过第一sdk模块的第一回调函数接口和第一发送消息接口实现通信,子进程通过第二sdk模块的第二回调函数接口和第二发送消息接口实现通信。

本实施例中,主进程通过调用第一sdk模块的发送消息接口发送通信信息,子进程通过调用所述第二sdk模块的第二回调函数接口接收该通信信息。同时,子进程通过调用第二sdk模块的发送消息接口发送通信信息,主进程通过调用第一sdk模块的第一回调函数接口接收该通信信息。

实施例3

本施例提供一种进程间通信方法,应用于通信终端上,如图4所示,包括以下步骤:

步骤s31,初始化第一sdk模块和第二sdk模块。

本实施例中,在初始化第一sdk模块时,将第一sdk模块的启动接口状态设置为第一状态,该启动接口为第一sdk模块的“设置子进程信息”接口中的“是否启动标识”接口,即将该接口的状态设置为不启动。该步骤中的其余内容与实施例2中的步骤s21相同,不再赘述。

步骤s32,建立主进程和一个或多个子进程之间的网络连接,一个或多个子进程通过第二sdk模块向第一sdk模块的网络连接端口发送连接请求。与实施例2中的步骤s22相同,不再赘述。

步骤s33,主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号,第一应答信号包括身份标识,身份标识用于唯一标识对应的子进程,第一sdk模块用于实现主进程的通信控制,第二sdk模块用于实现一个或多个子进程的通信控制。与实施例2中的步骤s23相同,不再赘述。

步骤s34,第一sdk模块根据主进程的通信状态,向对应于身份标识的子进程发送第二应答信号,子进程通过第二sdk模块接收第二应答信号。

本实施例中,步骤s34包括以下步骤:

步骤s341,判断主进程是否做好通信准备,在判断结果为是的情况下,执行步骤s342,否则循环执行步骤s341。

本实施例中,通过在第一sdk模块中设置标记位用于表示主进程的通信状态,例如,在第一sdk模块接受到第一应答信号时,将该标记为设置为0,然后检查第一sdk模块中端口连接、线程及消息队列的创建是否均成功,只有在上述创建均成功时,才将标记为设置为1,其余情况标记位都为0。在标记位为0的情况下,第一sdk模块中需要设置定时器再次检查,直至上述创建均成功,才能够向对应于身份标识的子进程发送第二应答信号。

步骤s342,将第一sdk模块的启动接口状态设置为第二状态。

本实施例中,待主程序准备充分后将启动接口状态设置为启动,再次调用该接口。其中,在第一sdk模块中会对外部设置过的子进程信息进行记录,并在外部再次设置时与之前的参数进行对比,从而检测子进程信息是否有变化。

步骤s343,第一sdk模块向对应于身份标识的子进程发送第二应答信号。

本实施例中,子进程只有接收到主进程回复的第二应答信号后才能认为双方都做好准备,可以进行其他业务通信。

步骤s35,判断子进程是否断开。在判断结果为是的情况下,执行步骤s33,否则执行步骤s36。

第一sdk模块和第二sdk模块分别通过触发各自的“子进程连接状态”回调函数的调用,让主进程和子进程获知相互间的连接状态。如果该“子进程连接状态”的回调函数的回调参数为“已连接”表示子进程未断开连接,如果该回调函数的回调参数为“断开连接”表示子进程断开连接。

步骤s36,进行主进程与子进程之间的通信,与实施例2中的步骤s25相同,不再赘述。

此外,本实施例中的第一sdk模块中还包括有“子进程启动的可行性检查”的回调函数,该回调函数可以处理下述情况:sdka对系统资源的占用是唯一性的,即加载它的进程同时只能运行一个。如果有其他加载了sdka的进程已启动,则主进程可能会采取不同的处理方案(如:弹出提示),这些方案由主进程的进程会话部分来实现,通过该回调函数触发。如果在子进程信息中不设置该回调函数,则第一sdk模块会认为不需要对子进程启动进行检查,即允许其启动。

实施例4

本实施例提供一种第一sdk模块和第二sdk模块的工作流程,其中第一sdk模块在进程间通信过程中执行以下步骤:

步骤s41,依次调用“初始化”和“设置监听连接端口”接口,若有一个调用失败则不能继续其他调用。

步骤s42,调用“设置子进程信息”接口,“是否启动标识”可以先设置为不启动,待主程序准备充分后将该项设置为启动,再次调用该接口。在第一sdk模块中会对外部设置过的子进程信息进行记录,并在外部再次设置时与之前的参数进行对比,从而检测自己才能信息是否有变化。

步骤s43,待收到第一sdk模块回调的“子进程连接状态变更”状态为“已连接”后,主进程才能向子进程发送其他业务指令。发送指令有对应接口。

步骤s44,主进程在运行过程中收到第一sdk模块回调的“子进程连接状态变更”状态为“断开连接”,则理论上应暂停向子进程发送指令。通常这时应是子进程在重启,可以稍微等待一会,待重新收到第一sdk模块回调的“子进程连接状态变更”状态为“已连接”后再恢复;

步骤s45,准备退出程序时调用“退出”接口。

第二sdk模块在进程间通信过程中执行以下步骤:

步骤s51,调用“初始化”接口,若调用失败则不能继续其他调用;

步骤s52,调用“设置子进程类型和连接端口”接口和设置回调函数。调用后子进程会在后台自动重新连接;

步骤s53,待进程连接成功并初步信令交互完成后,第二sdk模块会回调“子进程连接状态变更”状态为“已连接”,子进程收到该回调后才可以向主进程发送指令。在未收到该回调前,不会收到主进程的其他指令;收到“断开连接”通知后,应停止发送指令;

步骤s54,准备退出程序时调用“退出”接口。

实施例5

本实施例提供一种进程间通信装置,用于执行实施例1中的进程间通信方法。如图5所示,该进程间通信装置包括:

接收模块61,用于主进程通过第一sdk模块接收第二sdk模块发送的一个或多个子进程的第一应答信号,第一应答信号包括身份标识,身份标识用于唯一标识对应的子进程,第一sdk模块用于实现主进程的通信控制,第二sdk模块用于实现一个或多个子进程的通信控制;

发送模块62,用于第一sdk模块根据主进程的通信状态,向对应于身份标识的子进程发送第二应答信号,子进程通过所述第二sdk模块接收第二应答信号;

通信模块63,用于进行主进程与子进程之间的通信,其中,主进程通过第一sdk模块的第一回调函数接口和第一发送消息接口实现通信,子进程通过第二sdk模块的第二回调函数接口和第二发送消息接口实现通信。

本实施例分别通过第一sdk模块和第二sdk模块分别实现主进程和子进程的通信控制,其中,主进程通过第一sdk模块接收第二sdk模块发送的带有子进程身份标识的第一应答信号,从而能够避免在通信过程中集成多个sdk模块所导致的集成困难的问题。

作为本实施例的一种可选实施方式,如图6所示,该进程间通信装置还包括:

初始化模块64,用于初始化第一sdk模块和第二sdk模块。

网络连接模块65,建立主进程和一个或多个子进程之间的网络连接,一个或多个子进程通过第二sdk模块向第一sdk模块的网络连接端口发送连接请求。

作为本实施例的一种可选实施方式,如图6所示,发送模块62包括:

判断模块621,用于判断主进程是否做好通信准备。

设置模块622,用于在主进程的通信状态为已准备好通信时,将第一sdk模块的启动接口的状态设置为第二状态。

发送子模块623,用于第一sdk模块向对应于身份标识的子进程发送第二应答信号。

实施例6

图7是本发明实施例提供的通信终端的硬件结构示意图,如图7所示,该设备包括一个或多个处理器71以及存储器72,图7中以一个处理器71为例。

通信终端还可以包括:显示器(未示出),用于显示各进程的图形化界面。处理器71、存储器72和显示器可以通过总线或者其他方式连接,图7中以通过总线连接为例。

处理器71可以为中央处理器(centralprocessingunit,cpu)。处理器71还可以为其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

存储器72作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序、非暂态计算机可执行程序以及模块,如本发明实施例中的进程间通信方法对应的程序指令/模块。处理器71通过运行存储在存储器72中的非暂态软件程序、指令以及模块,从而执行服务器的各种功能应用以及数据处理,即实现上述实施例中,进程间通信方法。

存储器72可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储根据回声消除的测试装置的使用所创建的数据等。此外,存储器72可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施例中,存储器72可选包括相对于处理器71远程设置的存储器,这些远程存储器可以通过网络连接至进程间通信装置。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

所述一个或者多个模块存储在所述存储器72中,当被所述一个或者多个处理器71执行时,执行实施例1中所述的进程间通信方法。

上述产品可执行本发明实施例所提供的方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,具体可参见如图1所示的实施例中的相关描述。

实施例7

本发明实施例还提供了一种非暂态计算机存储介质,所述计算机存储介质存储有计算机可执行指令,该计算机可执行指令可执行实施例1中所述的进程间通信方法。其中,所述存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)、随机存储记忆体(randomaccessmemory,ram)、快闪存储器(flashmemory)、硬盘(harddiskdrive,缩写:hdd)或固态硬盘(solid-statedrive,ssd)等;所述存储介质还可以包括上述种类的存储器的组合。

本领域技术人员可以理解,实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(rom)或随机存储记忆体(ram)等。

虽然结合附图描述了本发明的实施例,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下作出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1