谷歌浏览器的源码分析(20)

系统 1654 0
 

上一次介绍到把网页连接地址生成一个消息通过 IPC 机制把消息发送出去,那么 IPC 的通讯机制是怎么样的呢?又是发送给谁呢?

由于这个浏览器是使用多进程的架构来工作的,所以进程之间就需要相互交流,这种交流是就是通讯,可以从源码里看到它是使用 IPC 的机制来通讯,实际采用的技术,就是 Windows 的命名管道的方式。可以看到这段代码:

#001   bool Channel::CreatePipe(const wstring& channel_id, Mode mode) {

#002     DCHECK(pipe_ == INVALID_HANDLE_VALUE);

#003     const wstring pipe_name = PipeName(channel_id);

#004     if (mode == MODE_SERVER) {

#005       SECURITY_ATTRIBUTES security_attributes = {0};

#006       security_attributes.bInheritHandle = FALSE;

#007       security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES);

#008       if (!win_util::GetLogonSessionOnlyDACL(

#009           reinterpret_cast<SECURITY_DESCRIPTOR**>(

#010               &security_attributes.lpSecurityDescriptor))) {

#011         NOTREACHED();

#012       }

#013  

#014       pipe_ = CreateNamedPipeW(pipe_name.c_str(),

#015                                PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |

#016                                   FILE_FLAG_FIRST_PIPE_INSTANCE,

#017                                PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,

#018                                 1,          // number of pipe instances

#019                                BUF_SIZE,   // output buffer size (XXX tune)

#020                                BUF_SIZE,   // input buffer size (XXX tune)

#021                                5000,       // timeout in milliseconds (XXX tune)

#022                                &security_attributes);

#023       LocalFree(security_attributes.lpSecurityDescriptor);

#024     } else {

#025       pipe_ = CreateFileW(pipe_name.c_str(),

#026                           GENERIC_READ | GENERIC_WRITE,

#027                           0,

#028                           NULL,

#029                           OPEN_EXISTING,

#030                           SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION |

#031                               FILE_FLAG_OVERLAPPED,

#032                           NULL);

#033     }

 

上面这段代码通过 WINDOWS API 函数 CreateNamedPipeW 函数来创建命名管道的服务器端,而通过 WINDOWS API 函数 CreateFileW 来打开客户端,这样两个进程之间就建立起来通讯的管道,两个进程之间的消息就可以相互发送了。

 

在浏览网页连接的消息,就是通过 IPC 的机制,让类 RenderProcessHost 把消息发送出去,那么这个消息是谁在另一端接收的呢?按照 IPC 的机制可知是另外一个进程在接收,这个进程就是类 RenderProcess

 

RenderProcessHost 把所有的消息通过类 IPC::ChannelProxy 发送出去,在另一个子进程里通过类 RenderThread 和类 RenderView 来接收消息,然后在类 RenderThread 和类 RenderView 把消息分发处理。

 

谷歌浏览器的源码分析(20)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论