2.2.1 main函数分析
Netd进程的入口函数是其main函数,代码如下所示。
[—>main.cpp]
- int main() {
- CommandListener *cl;
- NetlinkManager *nm;
- DnsProxyListener *dpl;
- MDnsSdListener *mdnsl;
- ALOGI("Netd 1.0 starting");
- // 为Netd进程屏蔽SIGPIPE信号
- blockSigpipe();
- // ①创建NetlinkManager
- nm = NetlinkManager::Instance();
- // ②创建CommandListener,它将创建名为"netd"的监听socket
- cl = new CommandListener();
- // 设置NetlinkManager的消息发送者(Broadcaster)为CommandListener。
- nm->setBroadcaster((SocketListener *) cl);
- // 启动NetlinkManager
- nm->start();
- ......
- // 注意下面这行代码,它为本Netd设置环境变量ANDROID_DNS_MODE为"local",其作用将在2.2.4节介绍
- setenv("ANDROID_DNS_MODE", "local", 1);
- // ③创建DnsProxyListener,它将创建名为"dnsproxyd"的监听socket
- dpl = new DnsProxyListener();
- dpl->startListener();
- // ④创建MDnsSdListener并启动监听,它将创建名为"mdns"的监听socket
- mdnsl = new MDnsSdListener();
- mdnsl->startListener();
- cl->startListener();
- while(1) {
- sleep(1000);
- }
- exit(0);
- }
Netd的main函数非常简单,主要是创建几个重要成员并启动相应的工作,这四个重要成员分别如下。
·NetlinkManager:接收并处理来自Kernel的UEvent消息。这些消息经NetlinkManager解析后将借助它的Broadcaster(也就是代码中为NetlinkManager设置的CommandListener)发送给Framework层的NetworkManagementService。
·CommandListener、DnsProxyListener、MDnsSdListener:分别创建名为"netd"、"dnsproxyd"、"mdns"的监听socket,并处理来客户端的命令。
下面将分别讨论这四位成员的作用。