上一次介紹到把網頁連接地址生成一個消息通過
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
把消息分發處理。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
