2.2.1 main函数分析

Netd进程的入口函数是其main函数,代码如下所示。

[—>main.cpp]

  1. int main() {
  2.  
  3. CommandListener *cl;
  4. NetlinkManager *nm;
  5. DnsProxyListener *dpl;
  6. MDnsSdListener *mdnsl;
  7.  
  8. ALOGI("Netd 1.0 starting");
  9.  
  10. // 为Netd进程屏蔽SIGPIPE信号
  11. blockSigpipe();
  12.  
  13. // ①创建NetlinkManager
  14. nm = NetlinkManager::Instance();
  15. // ②创建CommandListener,它将创建名为"netd"的监听socket
  16. cl = new CommandListener();
  17. // 设置NetlinkManager的消息发送者(Broadcaster)为CommandListener。
  18. nm->setBroadcaster((SocketListener *) cl);
  19. // 启动NetlinkManager
  20. nm->start();
  21. ......
  22. // 注意下面这行代码,它为本Netd设置环境变量ANDROID_DNS_MODE为"local",其作用将在2.2.4节介绍
  23. setenv("ANDROID_DNS_MODE", "local", 1);
  24. // ③创建DnsProxyListener,它将创建名为"dnsproxyd"的监听socket
  25. dpl = new DnsProxyListener();
  26. dpl->startListener();
  27.  
  28. // ④创建MDnsSdListener并启动监听,它将创建名为"mdns"的监听socket
  29. mdnsl = new MDnsSdListener();
  30. mdnsl->startListener();
  31.  
  32. cl->startListener();
  33.  
  34. while(1) {
  35. sleep(1000);
  36. }
  37. exit(0);
  38. }

Netd的main函数非常简单,主要是创建几个重要成员并启动相应的工作,这四个重要成员分别如下。

·NetlinkManager:接收并处理来自Kernel的UEvent消息。这些消息经NetlinkManager解析后将借助它的Broadcaster(也就是代码中为NetlinkManager设置的CommandListener)发送给Framework层的NetworkManagementService。

·CommandListener、DnsProxyListener、MDnsSdListener:分别创建名为"netd"、"dnsproxyd"、"mdns"的监听socket,并处理来客户端的命令。

下面将分别讨论这四位成员的作用。