Netd学习笔记
- service netd /system/bin/netd
- class main
- socket netd stream 0660 root system
- socket dnsproxyd stream 0660 root inet
启动/system/bin/netd应用程序为服务,入口函数为main,创建2个名字分别为netd和dnsproxyd的本地socket连接。分别对应:
- root@android:/ # ll /dev/socket/
- srwxrwxrwx root inet 1970-01-01 00:00 dnsproxyd
- srwxrwxrwx root system 1970-01-01 00:00 netd
备注:socket关键字用法,
- 代码阅读(注:由于说第一次分析netd的代码,我完全跟踪此代码的流程来看,先说init.rc,然后是main,之后依次展开):
- //main.cpp:main
- int main() {
- //........
- if (!(nm = NetlinkManager::Instance())) { //NetlinkManager需要分析,一眼看出它为单根模式。看看他到底做来什么?
- LOGE("Unable to create NetlinkManager");
- exit(1);
- };
- cl = new CommandListener();//CommandListener需要分析
- nm->setBroadcaster((SocketListener *) cl);
- if (nm->start()) { //直接看start函数。
- LOGE("Unable to start NetlinkManager (%s)", strerror(errno));
- exit(1);
- }
- /*
- * Now that we're up, we can respond to commands
- */
- if (cl->startListener()) {
- LOGE("Unable to start CommandListener (%s)", strerror(errno));
- exit(1);
- }
- // Eventually we'll become the monitoring thread
- while(1) {
- sleep(1000);
- }
- LOGI("Netd exiting");
- exit(0);
- }
直接跟进看NetlinkManager::start()
- int NetlinkManager::start() {
- struct sockaddr_nl nladdr;
- int sz = 64 * 1024;
- memset(&nladdr, 0, sizeof(nladdr));
- nladdr.nl_family = AF_NETLINK;
- nladdr.nl_pid = getpid();
- nladdr.nl_groups = 0xffffffff;
- if ((mSock = socket(PF_NETLINK,
- SOCK_DGRAM,NETLINK_KOBJECT_UEVENT)) < 0) {
- LOGE("Unable to create uevent socket: %s", strerror(errno));
- return -1;
- }
- if (setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) {
- LOGE("Unable to set uevent socket options: %s", strerror(errno));
- return -1;
- }
- if (bind(mSock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {
- LOGE("Unable to bind uevent socket: %s", strerror(errno));
- return -1;
- }
- mHandler = new NetlinkHandler(this, mSock);
- if (mHandler->start()) {
- LOGE("Unable to start NetlinkHandler: %s", strerror(errno));
- return -1;
- }
- return 0;
- }
看NetlinkHandler类:
- #ifndef _NETLINKHANDLER_H
- #define _NETLINKHANDLER_H
- #include <sysutils/NetlinkListener.h>
- #include "NetlinkManager.h"
- class NetlinkHandler: public
NetlinkListener { // NetlinkListener类之前有分析,这个是网络监听的框架实现类。 - NetlinkManager *mNm;
- public:
- NetlinkHandler(NetlinkManager *nm, int listenerSocket);
- virtual ~NetlinkHandler();
- int start(void);
- int stop(void);
- protected:
- virtual
void onEvent(NetlinkEvent *evt);
- void notifyInterfaceAdded(const
char *name); - void notifyInterfaceRemoved(const
char *name); - void notifyInterfaceChanged(const
char *name, bool isUp); - };
- #endif
晕死,怎么排版乱完了,而且还丢失了部分数据。
Netd学习笔记的更多相关文章
- Android(java)学习笔记160:Framework运行环境之 Android进程产生过程
1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...
- Android(java)学习笔记103:Framework运行环境之 Android进程产生过程
1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
随机推荐
- BZOJ 1877: [SDOI2009]晨跑(费用流)
看到要求两个量就下意识的想到了费用流= =,先把一个点拆成两个点就能够解决一个的只经过一次的限制 CODE: #include<cstdio>#include<iostream> ...
- Android的开机流程
Android的开机流程 1. 系统引导bootloader 1) 源码:bootable/bootloader/* 2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择 a) ...
- WP8.1程序开发中,如何加载本地文件资源或安装在程序包中的资源。
Web 要访问来自 Web 的文件,你可以使用标准的绝对 HTTP URI: <img src="http://www.contoso.com/images/logo.png" ...
- UCOSII时间任务块
转:http://blog.csdn.net/wchp314/article/details/5416476 uCOS-II的任务控制块 标签: uCOS-II 2009-12-01 14:45 ...
- css 居中,中央
在我的技巧里,有4中居中中央的方法: 1.position:absolute; top:50%;left:50%; margin : -x 0 0 -x; 这是绝对定位的方法,通过算法移动,坏处就是必 ...
- mybatis系列笔记(1)---mybatis入门
mybatis入门 MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...
- 依赖ConstraintLayout报错,Could not find *****,Failed to resolve:*****
ConstraintLayout 约束布局,AndroidStudio2.2中新增功能之一,可以先去看看这篇文章 Android新特性介绍,ConstraintLayout完全解析,2.3版本的And ...
- 3555: [Ctsc2014]企鹅QQ
3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 696 Solved: 294[Submit][Status ...
- 不懂这些分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构
互联网行业是大势所趋,从招聘工资水平即可看出,那么如何提升自我技能,满足互联网行业技能要求?需要以目标为导向,进行技能提升,本文主要针对招聘中高频提及的分布式系统设计.架构(数据一致性)做了分析,祝各 ...
- android国际化
语言的国际化 为了提供不同语言的版本,只需要在res中新建几个values文件夹就行 不过文件夹有自己的命名规则 values-语言代码-r国家或者地区的代码 然后我们只需要将不同语言的string. ...