Linux进程间通讯方法及装置、进程退出监听方法与流程

文档序号:12363217阅读:407来源:国知局
Linux进程间通讯方法及装置、进程退出监听方法与流程

本发明涉及Linux平台技术领域,尤其涉及Linux进程间通讯方法及装置、进程退出监听方法。



背景技术:

Linux是一种自由和开放源码的类Unix操作系统,可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。Linux系统是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。

现有的Linux下进程通讯的集中主要手段简介:

管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程之间的通讯,有名管克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。

报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

上述现有进程通讯手段中管道需要名字、亲缘关系,且只能承载无格式字节流以及缓冲区大小受限,而信号具有承载信息量小、不可靠的限制等缺点,共享内存需要考虑进程间的同步及互斥,增加了设计的复杂度的限制。



技术实现要素:

为解决上述技术问题,本发明提供一种Linux进程间通讯方法及装置、进程退出监听方法,能够实现简单轻量级的进程间通讯及进程退出监听。

本发明提供的技术方案如下:

本发明公开了一种Linux进程间通讯方法,包括步骤:S11:核心进程轮询消息队列中的消息;S12:核心进程解析所述消息并判断所述消息是否为注册事件的事件信息;S13:当判断所述消息为注册事件的事件信息时,根据所述事件信息查找事件管理链表,获得所有监听该注册事件的进程号;S14:核心进程根据所述进程号唤醒所有监听该注册事件的进程,并根据事件处理函数链表调用每个进程中该注册事件对应的事件处理函数。

本发明通过消息队列及链表来实现Linux事件的监听,从而实现进程之间的轻量级的通讯,Linux系统上层的应用程序只需要注册需要监听的事件以及注册事件的事件处理函数,当相关的事件发生时就会调用注册事件的事件处理函数来实现进程的通讯。本发明通过采用event广播机制实现了Linux系统进程间轻量级通讯,增强了系统的稳定性,同时节省了系统的资源。

进一步优选的,所述步骤S1之前还包括步骤:S01:为每个进程建立所述事件处理函数链表;所述事件处理函数链表包括所述注册事件的事件名及对应的所述事件处理函数;S02:核心进程建立事件管理链表;所述事件管理链表包括每个注册事件的事件名及所有监听该注册事件的进程号。

进一步优选的,所述步骤S12“判断所述消息是否为注册事件的事件信息”具体包括步骤:S121:判断所述消息的类型是否为event类型;若是,执行步骤S13;否则不作处理。

进一步优选的,所述步骤S13“根据所述事件信息查找事件管理链表,获得所有监听该注册事件的进程号”具体包括:S131:根据所述事件信息中的事件名查找所述事件管理链表中与所述事件名对应的进程号,获得所有监听所述事件名对应的注册事件的进程号。

本发明还公开了一种进程退出监听方法,使用上述Linux进程间通讯方法监听进程退出消息,包括步骤:S21:当有进程退出时,系统执行内核的do_exit函数;S22:所述do_exit函数调用预设的自定义函数;S23:预设进程根据所述自定义函数获取退出进程的进程信息,并封装所述进程信息生成进程退出事件信息上传至核心进程的消息队列;S24:核心进程读取并解析所述消息队列中的所述进程退出事件信息,并根据所述进程退出事件信息获得监听该进程退出事件的进程号;S25:核心进程根据所述进程号唤醒所有监听该进程退出事件的进程,并根据事件处理函数链表调用每个进程中该进程退出事件对应的事件处理函数。

本发明通过Hook技术实现系统所有进程退出的监听,通过将汇编的指令码,跳转地址转换为机器码,将系统中原本的调用函数替换为自定义函数来实现监听。本发明提供的轻量级的进程退出监听方法使用简便,相比其他的进程通讯增强了系统的稳定性,节省了系统的资源。

进一步优选的,所述步骤S21之前还包括步骤:S20:在核心进程的所述事件管理链表中建立进程退出事件的事件名及所有监听该注册事件的进程号,注册进程退出事件;同时,在监听所述进程退出事件的所有进程中建立注册所述进程退出事件对应的事件处理函数。

进一步优选的,所述进程信息包括退出进程的进程号及名称;所述步骤S23“封装所述进程信息,生成进程退出事件信息”具体包括:S231:将所述退出进程的进程号、名称与该退出进程对应的退出进程事件的事件名封装生成进程退出事件信息。

进一步优选的,所述步骤S24“核心进程读取并解析所述消息队列中所述进程退出事件信息”具体包括步骤:S241:核心进程读取所述消息队列中event类型的消息,解析所述event类型的消息获得进程退出事件信息。

进一步优选的,所述步骤S24“根据所述进程退出事件信息获得监听该进程退出事件的进程号”具体包括步骤:S242:根据所述进程退出事件信息获得进程退出事件的事件名;根据所述进程退出事件的事件名查找所述事件管理链表中与所述事件名对应的进程号,获得监听该进程退出事件的进程号。

进一步优选的,所述步骤S21和步骤S22之间还包括步骤:S215:将内核中的进程退出函数替换为预设的自定义函数。

本发明还公开一种Linux进程间通讯装置,使用上述Linux进程间通讯方法,包括:轮询模块,用于轮询消息队列中的消息;解析模块,用于解析消息队列中的所述消息;判断模块,用于判断所述消息是否为注册事件的事件信息;查找模块,用于当判断所述消息为注册事件的事件信息时根据所述事件信息查找事件管理链表,获得所有监听该注册事件的进程号;执行模块,用于根据所述进程号唤醒所有监听该注册事件的进程,并根据事件处理函数链表调用每个进程中该注册事件对应的事件处理函数。

本发明提供了一种轻量级的进程间通讯方法及装置实现了event广播机制及进程退出监听,与现有技术相比,克服了现有进程间通讯方法的缺点。本发明给上层应用的使用提供了简单的接口,所有功能的实现都由event核心来实现,使用简便,同时保证了数据传输的可靠性,增强了系统的稳定性,同时节省了系统的资源。

附图说明

下面将以明确易懂的方式,结合附图说明优选实施方式,对本发明予以进一步说明。

图1为本发明一种Linux进程间通讯方法的主要步骤示意图;

图2为本发明一种Linux进程间通讯方法的完整步骤示意图;

图3为本发明一种进程退出监听方法的主要步骤组成图;

图4为本发明一种进程退出监听方法的完整步骤组成图;

图5为本发明一种Linux系统进程间通讯装置的组成示意图。

附图标号说明:

100、轮询模块,200、解析模块,300、判断模块,400、查找模块,500、执行模块。

具体实施方式

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对照附图说明本发明的具体实施方式。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图,并获得其他的实施方式。

为使图面简洁,各图中只示意性地表示出了与本发明相关的部分,它们并不代表其作为产品的实际结构。另外,以使图面简洁便于理解,在有些图中具有相同结构或功能的部件,仅示意性地绘示了其中的一个,或仅标出了其中的一个。在本文中,“一个”不仅表示“仅此一个”,也可以表示“多于一个”的情形。

在Linux下内核管理着各种设备的使用并把设备的状态信息或变化事件以内核消息或事件的形式发布出去,在应用层需要通过特定途径来获得内核各种消息或事件从而实现内核与用户应用间的信息交流与传递。在实际中会有多个应用或者多个模块需要监听同一种内核消息或事件,需要在多个应用或者多个模块中进行内核事件的分发。现有技术中对于不同应用需要监听或者获得内核事件时,在不同应用中或者不同模块中独自建立监听套接字来直接监听获得内核消息;或者使用udev来获得设备插拔等内核事件。

为此,本发明提供一种Linux进程间通讯方法,通过核心进程event广播机制实现内核消息或事件的分发。

图1为本发明一种Linux进程间通讯方法的主要步骤示意图,作为本发明的一个具体实施例,如图1所示,一种Linux进程间通讯方法,包括步骤:S11:核心进程轮询消息队列中的消息;S12:核心进程解析所述消息并判断所述消息是否为注册事件的事件信息;S13:当判断所述消息为注册事件的事件信息时,根据所述事件信息查找事件管理链表,获得所有监听该注册事件的进程号;S14:核心进程根据所述进程号唤醒所有监听该注册事件的进程,并根据事件处理函数链表调用每个进程中该注册事件对应的事件处理函数。

本发明通过消息队列及链表来实现Linux事件的监听,从而实现进程之间的轻量级的通讯,Linux系统上层的应用程序只需要注册需要监听的事件以及注册事件的事件处理函数,当相关的事件发生时就会调用注册事件的事件处理函数来实现进程的通讯。本发明通过采用event广播机制实现了Linux系统进程间轻量级通讯,增强了系统的稳定性,同时节省了系统的资源。

优选的,图2为本发明一种Linux进程间通讯方法的完整步骤示意图,作为本发明一个具体实施例,如图2所示,所述步骤S1之前还包括步骤:S01:为每个进程建立所述事件处理函数链表;所述事件处理函数链表包括所述注册事件的事件名及对应的所述事件处理函数;S02:核心进程建立事件管理链表;所述事件管理链表包括每个注册事件的事件名及所有监听该注册事件的进程号。

具体的,事件处理函数链表是一个事件处理函数的列表,每个链都与某个或某些事件有关,当特定的事件发生时,就调用相应的事件处理函数链表中的回调函数,进行相应的处理。

优选的,所述步骤S12中“判断所述消息是否为注册事件的事件信息”具体包括步骤:S121:判断所述消息的类型是否为event类型;若是,执行步骤S13;否则不作处理。

优选的,所述步骤S13“根据所述事件信息查找事件管理链表,获得所有监听该注册事件的进程号”具体包括:S131:根据所述事件信息中的事件名查找所述事件管理链表中与所述事件名对应的进程号,获得所有监听所述事件名对应的注册事件的进程号。

综上所述,本发明的流程具体包括:

一、注册过程:

监听事件以及事件处理函数的注册,提供优先级以及远程调用模式。实现方式为:将此注册的监听事件加入到此进程的事件处理函数链表中,同时将注册的监听事件添加到消息队列中,在event的核心进程中会读取消息队列中的注册事件添加到事件管理链表中,设置事件的相关工作模式。

二、监听过程:

系统发送监听事件,如果event的核心进程注册了此监听事件及事件的事件处理函数,将会调用此监听事件的回调函数。实现方式:将监听的事件封装后添加到消息队列中,event的核心进程读取消息队列中的消息,获取注册事件并唤醒监听此注册事件的进程,同时调用事件处理函数。如果该事件的工作模式为RPC(Remote Procedure Call,远程过程调用),事件的处理函数将事件数据处理完毕后返回给监听事件的发送进程,这样就实现了远程调用的功能。

图3为本发明一种进程退出监听方法的主要步骤组成图,作为本发明的一个具体实施例,如图3所示,一种进程退出监听方法,使用上述Linux进程间通讯方法监听进程退出消息,包括步骤:S21:当有进程退出时,系统执行内核的do_exit函数;S22:所述do_exit函数调用预设的自定义函数;S23:预设进程根据所述自定义函数获取退出进程的进程信息,并封装所述进程信息生成进程退出事件信息上传至核心进程的消息队列;S24:核心进程读取并解析所述消息队列中的所述进程退出事件信息,并根据所述进程退出事件信息获得监听该进程退出事件的进程号;S25:核心进程根据所述进程号唤醒所有监听该进程退出事件的进程,并根据事件处理函数链表调用每个进程中该进程退出事件对应的事件处理函数。

图4为本发明一种进程退出监听方法的完整步骤组成图,如图4所示,优选的,所述步骤S21和步骤S22之间还包括步骤:S215:将内核中的进程退出函数替换为预设的自定义函数。

具体的,本发明将上述Linux进程间通讯方法与Hook技术相结合,提供了一种监听进程退出的方法。Hook技术是一个相对较宽的话题,因为操作系统从ring3到ring0是分层次的结构,在每一个层次上都可以进行相应的Hook,它们使用的技术方法以及取得的效果也是不尽相同。我们知道实现一个系统调用的函数中一定会递归的嵌套有很多的子函数,即它必定要调用它的下层函数。而从汇编的角度来说,对一个子函数的调用是采用"段内相对短跳转jmp offset"来实现的,即CPU根据offset来进行一个偏移量的跳转。

如果把下层函数在上层函数中的offset替换成自定义的"Hook函数"的offset,这样上层函数调用下层函数时,就会跳到自定义的"Hook函数"中,就可以在"Hook函数"中做过滤和劫持内容的工作。

kernel inline hook技术就是修改内核函数的opcode,通过写入jmp或push ret等指令跳转到新的内核函数中。

Linux系统中进程的退出通过系统调用后都会进入到内核的do_exit函数中,do_exit将会调用自定义函数profile_task_exit,本发明中将自定义的my_profile_task_exit来替换系统调用profile_task_exit,调用完毕自定义的my_profile_task_exit后再调用profile_task_exit。在这里主要修改汇编的bl跳转指令的跳转码,来实现在do_exit中调用自定义的my_profile_task_exit,在自定义的my_profile_task_exit中获取退出进程的进程号以及名称,与对应进程退出事件的事件名封装后通过netlink上传到event核心,event的核心进程收到后广播给监听进程退出的进程。具体的,event的核心进程的广播参见上述Linux进程间通讯方法中关于核心进程唤醒监听注册事件的进程部分的详细说明。

本发明通过Hook技术实现系统所有进程退出的监听,通过将汇编的指令码,跳转地址转换为机器码,将系统中原本的调用函数替换为自定义的进程退出函数来实现监听。本发明提供的轻量级的进程退出监听方法使用简便,相比其他的进程通讯增强了系统的稳定性,节省了系统的资源。

优选的,如图4所示,在执行监听之前还包括进程退出事件及事件处理函数的注册,即本发明所述步骤S21之前还包括步骤:S20:在核心进程的所述事件管理链表中建立进程退出事件的事件名及所有监听该注册事件的进程号,注册进程退出事件;同时,在监听所述进程退出事件的所有进程中建立注册所述进程退出事件对应的事件处理函数。具体注册过程参见上述Linux进程间通讯方法中关于事件注册与事件处理函数注册的详细说明。

优选的,所述进程信息包括退出进程的进程号及名称;所述步骤S23“封装所述进程信息,生成进程退出事件信息”具体包括:S231:将所述退出进程的进程号、名称与该退出进程对应的退出进程事件的事件名封装生成进程退出事件信息。

具体的,本发明中设有一个专门的预设进程,用于接收系统下层发过来的进程退出的进程号及名称,接收后再与进程退出事件的名称一起再封装,再传给event的核心进程。

优选的,所述步骤S24“核心进程读取并解析所述消息队列中所述进程退出事件信息”具体包括步骤:S241:核心进程读取所述消息队列中event类型的消息,解析所述event类型的消息获得进程退出事件信息。

优选的,所述步骤S24“根据所述进程退出事件信息获得监听该进程退出事件的进程号”具体包括步骤:S242:根据所述进程退出事件信息获得进程退出事件的事件名;根据所述进程退出事件的事件名查找所述事件管理链表中与所述事件名对应的进程号,获得监听该进程退出事件的进程号。

图5为本发明一种Linux进程间通讯装置的组成示意图,作为本发明的一个具体实施例,如图5所示,一种Linux进程间通讯装置,使用上述Linux进程间通讯方法,包括:轮询模块100,用于轮询消息队列中的消息;解析模块200,用于解析消息队列中的所述消息;判断模块300,用于判断所述消息是否为注册事件的事件信息;查找模块400,用于当判断所述消息为注册事件的事件信息时根据所述事件信息查找事件管理链表,获得所有监听该注册事件的进程号;执行模块500,用于根据所述进程号唤醒所有监听该注册事件的进程,并根据事件处理函数链表调用每个进程中该注册事件对应的事件处理函数。

本发明提供了一种合理的轻量级的进程间通讯方法及装置,来实现event广播机制以及进程线程退出的监听,吸取传统进程间通讯机制的优点,克服其缺点,保证系统的稳定性、可靠性、移植性,使用简便。

需要说明的是,本系统中各模块之间的信息交互、执行过程等内容与上述Linux进程间通讯方法实施例基于同一构思,具体内容可参见本发明Linux进程间通讯方法实施例中的叙述,此处不再赘述。

应当说明的是,上述实施例均可根据需要自由组合。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

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