1. 程式人生 > >谷歌瀏覽器的源碼分析 20

谷歌瀏覽器的源碼分析 20

易懂 esc 命名 建立 bin 函數 cas ref out

分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

上一次介紹到把網頁連接地址生成一個消息通過IPC機制把消息發送出去,那麽IPC的通訊機制是怎麽樣的呢?又是發送給誰呢?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

由於這個瀏覽器是使用多進程的架構來工作的,所以進程之間就需要相互交流,這種交流是就是通訊,可以從源碼裏看到它是使用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把消息分發處理。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

谷歌瀏覽器的源碼分析 20