一种基于Chromium的命名管道进程通信方法与流程

文档序号:13620121阅读:479来源:国知局

本发明涉及ipc通信领域,尤其涉及一种基于chromium的命名管道进程通信方法。



背景技术:

随着internet的推广及普及,浏览器作为访问互联网的重要入口,逐渐呈现出多样化、复杂化的趋势,尤其是html5的制定,预示着浏览器已彻底告别以浏览网页、搜索为主要功能的旧时代,而逐渐向模拟甚至于取代操作系统实现其各类功能的webos时代延伸;而移动互联网的蓬勃兴起,则加剧了这一过程的转化。这些趋势为浏览器带来新的机遇的同时,也带来了很大的挑战,目前的浏览器不仅要有丰富的展示功能,还要有稳定的性能体验和可靠的安全保障。

chrome(chromium)浏览器依托于开源项目chromium,相较于ie、firefox、oprah等同类产品而言,有着诸多的优势;chromium(chrome浏览器)率先采用多进程架构,避免单个页面或者web应用的崩溃而影响整个浏览器的稳定性;采用多线程机制,减少了页面响应时间,提高了效率;采用进程间通信机制,完成不同进程之间的交互协作。

原有的chromium内部使用的是基于匿名管道的unixdomainsocket,使用socketpair函数完成通信管道的建立,优点是无需对生成的socket进行额外的绑定、监听和连接操作,在子进程产生之前就创建完成子进程通信所需的fd,开销较小;缺点是仅可以完成父子进程之间的通信,不能实现任意进程之间的通信。基于命名管道的unixdomainsocket与一般的网络socket类似,二者编程的不同如下:

1.、addressfamily为af_unix;

2、因为应用于ipc,所以这类型unixdomainsocket不需要ip和端口,取而代之的是用结构体sockaddr_un表示,这和结构体描述的是一个socket类型的文件在文件系统中的路径,这个socket文件由bind()调用创建,如果调用bind()时该文件已存在,则bind()错误返回;

3、unixdomainsocket的client端一般要显式调用bind函数,而不像网络socket一样依赖系统自动分配的地址。客户端bind的socket文件名可以包含客户端的pid,这样服务器就可以区分不同的client端。



技术实现要素:

本发明的目的在于克服目前chromium的基于匿名管道的unixdomainsocket只能实现父子进程间的通信的局限性,提供一种基于chromium的命名管道进程通信方法,该方法虽然需要进行额外的绑定、监听和连接操作,进程通信所需的fd需要在进程创建之后才能创建,开销有所增加,但进程的适用范围更广,可以完成任意进程之间的通信。

为了实现上述目的,本发明提供了一种基于chromium的命名管道进程通信方法,所述方法包括:对需要通信的进程a和b基于命名管道的unixdomainsocket分别创建server端和client端,并生成相应的socket句柄fd1和fd2,两个socket句柄分别与libevent的事件进行绑定,当client端向server端发起请求时,server端绑定的事件被触发,生成用于通信的socket句柄fd3,并与libevent的事件进行绑定,则server端利用句柄fd3和事件发送和接收消息,client端利用句柄fd2和事件发送和接收消息。

上述技术方案中,所述方法具体包括:

步骤1)创建两个需要进行通信进程:进程a和进程b;

步骤2)进程a通过基于命名管道的unixdomainsocket创建一个server端,生成相应的socketfd:fd1,并对fd1进行绑定和监听;fd1与libevent的一个事件进行绑定,从而让libevent对其进行监控;

步骤3)进程b通过基于命名管道的unixdomainsocket创建一个client端,生成相应的socketfd:fd2,对fd2进行绑定并向server端发起连接请求;

步骤4)当server端获得连接请求以后,libevent被绑定的事件会被触发,通知server端回调函数accept,accept函数返回成功值表示server端已接受连接,并且生成新的用于与进程b通信的socketfd:fd3;

步骤5)server端接受连接后,client端会向server端发送一个hellomessage,如果server端收到,则连接已经建立;

步骤6)server端将fd3与libevent的一个事件绑定;

步骤7)进程a与进程b建立连接以后,进程a利用fd3与client端进行通信,进程b利用fd2与server端进行通信;当其中一端向另一端发消息的时候,另一端socketfd所绑定的libevent事件会被触发,通知此端处理消息。

本发明的技术优势在于:

原有的chromium内部使用的是基于匿名管道的unixdomainsocket,仅可以完成父子进程之间的通信,并且在子进程产生之前就创建完成该子进程通信所需的fd;本发明的方法基于命名管道的unixdomainsocket,可以完成任意进程之间的通信,与chromium原有的相比,进程的适用范围更广。

附图说明

图1是本发明实现的基于chromium的命名管道ipc通信机制的建立流程示意图;

图2是本发明实现的基于chromium的命名管道ipc通信机制建立后消息的发送和处理流程示意图。

具体实施方式

下面结合附图对本发明的内容进一步详细描述。

如图1所示,一种基于chromium的命名管道进程通信方法,所述方法包括:

步骤1)创建两个需要进行通信进程:进程a和进程b;

步骤2)进程a通过基于命名管道的unixdomainsocket创建一个server端,生成相应的socketfd:fd1,并对fd1进行绑定和监听;fd1与libevent的一个事件进行绑定,从而让libevent对其进行监控;

步骤3)进程b通过基于命名管道的unixdomainsocket创建一个client端,生成相应的socketfd:fd2,对fd2进行绑定并向server端发起连接请求;

步骤4)当server端获得连接请求以后,libevent被绑定的事件会被触发,通知server端回调函数accept,accept函数返回成功值表示server端已接受连接,并且生成新的用于与进程b通信的socketfd:fd3;

步骤5)server端接受连接后,client端会向server端发送一个hellomessage,如果server端收到,则连接已经建立;

步骤6)server端将fd3与libevent的一个事件绑定;

步骤7)进程a与进程b建立连接以后,进程a(server端)利用fd3与client端进行通信,进程b(client端)利用fd2与server端进行通信;当其中一端向另一端发消息的时候,另一端fd所绑定的libevent事件会被触发,通知此端处理消息。

如图2所示,当命名管道进程通信机制在chromium当中建立以后,消息的发送和处理流程为:

当有ipc消息需要发送的时候,sender通过send方法把消息提交给channelproxy类。如果是同步消息(同步消息是指发送者将ipc消息发送给接收者之后,会等待接收者回复一个ipc消息),则需要提交给syncchannel类完成。这两个类接收到发送ipc消息的请求之后,会将要发送的ipc消息转发给channelposix处理。channelposix接收到消息以后,将其放入消息队列当中,并通过调用sendmsg或者write将其写入unixdomainsocket。

由于ipc::listener通过i/o线程监控了用来创建ipc通道的socket,因此当该socket有新的数据可读时,server端的listener就可以通过libevent获得一个新的读(ev_read)事件通知。该ev_read事件会触发channelposix从消息队列中取出消息,并交给channelreader。channelreader获得ipc消息之后,先转发给注册在channelproxy或者syncchannel当中的messagefilter,向其询问是否需要处理消息。如果需要处理,那么交给它们处理;如果不需要,则传递给listener。listener同样也可以只处理一部分ipc消息,对于自己不感兴趣的ipc消息,listener会将转发给注册到它内部的一系列route进行处理。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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